Skip to content

Commit

Permalink
Version 0.0.1
Browse files Browse the repository at this point in the history
  • Loading branch information
joar committed Sep 23, 2012
1 parent 5c89550 commit 41233b3
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 38 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@
/lib /lib
/local /local
.py[co] .py[co]
/automgtic_local.ini
*.egg-info
6 changes: 6 additions & 0 deletions automgtic.ini
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,6 @@
# WARNING: Do not edit this file directly, copy it first to automgtic_local.ini
[automgtic]

[mediagoblin]
client_id = add yours here
server = http://joar.pagekite.me
146 changes: 109 additions & 37 deletions automgtic/__init__.py
Original file line number Original file line Diff line number Diff line change
@@ -1,25 +1,123 @@
from urllib2 import urlopen import logging
import os
import hashlib
import json


from urllib2 import urlopen, Request

from poster.streaminghttp import register_openers
from poster.encode import multipart_encode
from oauthlib.oauth2.draft25 import WebApplicationClient from oauthlib.oauth2.draft25 import WebApplicationClient
from automgtic.models import Config, session from configobj import ConfigObj
from validate import Validator

from automgtic.models import Media, session

register_openers()

_log = logging.getLogger(__name__)

config = app_config = mg_config = {}


def load_config():
global config, app_config, mg_config

configspec = ConfigObj('automgtic/config_spec.ini',
list_values=False,
_inspec=True)

if os.path.exists('automgtic_local.ini'):
config_path = 'automgtic_local.ini'
else:
config_path = 'automgtic.ini'

config = ConfigObj(config_path,
configspec=configspec,
interpolation='ConfigParser')

validator = Validator()
validation_result = config.validate(validator, preserve_errors=True)

app_config = config['automgtic']
mg_config = config['mediagoblin']


load_config()

_log.debug(config)


def walk_files(directory):
for root, directories, files in os.walk(directory):
for f in files:
yield os.path.join(root, f)


def upload_if_not_exist(path, digest):
media = Media.query.filter(Media.digest == unicode(digest)).first()

if media:
_log.debug('Contents of {0} already exist on the server'.format(path))
return

_log.info('Uploading {0}...'.format(path))
datagen, headers = multipart_encode({'file': open(path, 'rb')})

request = Request(mg_config['server'] + '/api/submit?access_token=' \
+ mg_config['access_token'],
datagen, headers)


response = urlopen(request).read()
_log.info('Posted {0}'.format(path))
_log.debug('response: {0}'.format(response))


def set_client_id(client_id): media_data = json.loads(response)
client_id = client_id or raw_input('Client identifier: ') _log.debug('media data: {0}'.format(media_data))
set_config('client_id', client_id)
media = Media(digest, os.path.split(path)[-1], json.dumps(media_data))

session.add(media)
session.commit()


def run_autoupload(directory):
for path in walk_files(directory):
digest = digest_file(path)
_log.debug('{0} - sum: {1}'.format(
path,
digest))
upload_if_not_exist(path, digest)


def digest_file(f, block_size=2 ** 20):
md5 = hashlib.md5()

if type(f) in [str, unicode]:
f = open(f, 'rb')

while True:
block = f.read(block_size)

if not block:
break

md5.update(block)

return md5.hexdigest()




def authorize(): def authorize():
client = get_client() client = get_client()
uri = client.prepare_request_uri( uri = client.prepare_request_uri(
get_config('mg_server') + '/oauth/authorize', mg_config['server'] + '/oauth/authorize',
redirect_uri='http://foo.example/') redirect_uri='http://foo.example/')


print 'Go to {0}, then paste the "?code=$CODE" $CODE part.'.format(uri) print 'Go to {0}, then paste the $CODE part in "?code=$CODE" below.'.format(uri)
code = raw_input('code: ') code = raw_input('code: ')


token_uri = client.prepare_request_uri( token_uri = client.prepare_request_uri(
get_config('mg_server') + '/oauth/access_token', mg_config['server'] + '/oauth/access_token',
code=code) code=code)


token_request = urlopen(token_uri) token_request = urlopen(token_uri)
Expand All @@ -29,36 +127,10 @@ def authorize():


print 'Token data: {0}'.format(token_data) print 'Token data: {0}'.format(token_data)


set_config('access_token', token_data['access_token']) mg_config['access_token'] = token_data['access_token']
config.write()




def get_client(): def get_client():
client = WebApplicationClient(get_config('client_id')) client = WebApplicationClient(mg_config['client_id'])
return client return client


def get_config(key, default=None):
conf = Config.query.filter(Config.key == unicode(key)).first()

if not conf and not default:
raise ValueError('{0} is not configured.'.format(key))
elif not conf:
return default
else:
return conf.value


def set_config(key, value, checkfirst=False):
conf = Config.query.filter(Config.key == unicode(key)).first()

if checkfirst:
if conf:
raise NameError('{0} is already set in the configuration.'.format(key))

if conf:
conf.value = unicode(value)
else:
conf = Config(unicode(key), unicode(value))
session.add(conf)

session.commit()
7 changes: 7 additions & 0 deletions automgtic/config_spec.ini
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,7 @@
[automgtic]
file_extensions = string_list(default=list("png", "jpg"))

[mediagoblin]
client_id = string(default='')
server = string(default='')
access_token = string(default='')
24 changes: 23 additions & 1 deletion automgtic/models.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.orm import sessionmaker, scoped_session


engine = create_engine('sqlite:///automgtic.db', echo=True) engine = create_engine('sqlite:///automgtic.db')


Session = scoped_session(sessionmaker(bind=engine)) Session = scoped_session(sessionmaker(bind=engine))
session = Session() session = Session()
Expand All @@ -15,6 +15,7 @@ class AutomgticBase(object):




class Config(Base): class Config(Base):
# TODO: Use a configuration file for the config
__tablename__ = 'core__config' __tablename__ = 'core__config'


id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
Expand All @@ -31,3 +32,24 @@ def __repr__(self):
self.id, self.id,
self.key.decode('ascii', 'replace'), self.key.decode('ascii', 'replace'),
self.value.decode('ascii', 'replace')) self.value.decode('ascii', 'replace'))


class Media(Base):
__tablename__ = 'core__media'

id = Column(Integer, primary_key=True)
digest = Column(Unicode(255), index=True, unique=True)
name = Column(Unicode(1024))
mediagoblin_data = Column(Unicode(8096))

def __init__(self, digest, name, mediagoblin_data):
self.digest = unicode(digest)
self.name = unicode(name)
self.mediagoblin_data = unicode(mediagoblin_data)

def __repr__(self):
return '<{0} #{1} {2} ({3})>'.format(
self.__class__.__name__,
self.id,
self.digest,
self.name)
15 changes: 15 additions & 0 deletions run.py
100644 → 100755
Original file line number Original file line Diff line number Diff line change
@@ -1,9 +1,20 @@
#!/usr/bin/env python
import argparse import argparse
import automgtic import automgtic
import logging

root_log = logging.getLogger()
logging.basicConfig()
root_log.setLevel(logging.DEBUG)


if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='automgtic - Autouploader for GNU MediaGoblin') description='automgtic - Autouploader for GNU MediaGoblin')
parser.add_argument(
'directory',
type=str,
nargs='?',
)
parser.add_argument( parser.add_argument(
'--authorize', '--authorize',
const=True, const=True,
Expand All @@ -17,5 +28,9 @@


args = parser.parse_args() args = parser.parse_args()


root_log.debug(args)

if args.authorize: if args.authorize:
automgtic.authorize() automgtic.authorize()
if args.run:
automgtic.run_autoupload(args.directory)
17 changes: 17 additions & 0 deletions setup.py
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,17 @@
from setuptools import setup, find_packages

setup(
name='automgtic',
version='0.0.1',
author='Joar Wandborg',
author_email='joar [hex 40] wandborg [hex 2e] se',
url='https://github.com/jwandborg/automgtic',
packages=find_packages(),
include_package_data=True,
install_requires=[
'setuptools',
'configobj',
'sqlalchemy',
'simplejson',
'poster'],
license='Apache License v2')

0 comments on commit 41233b3

Please sign in to comment.