Plan 9 from Bell Labs’s /usr/web/sources/contrib/maht/blogger/blogger.py

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#!/bin/python

from gdata import service
import gdata
import atom
import sys
import popen2
import string
import re

post_id = re.compile('.*post-([0-9]+)')

class Blogger :
	def __init__(self, username, password, blog_id=None) :
		self.service = service.GDataService(username, password)
		self.service.source = 'Plan9 BloggerFS'
		self.service.service = 'blogger'
		self.service.account_type = 'GOOGLE'
		self.service.server = 'www.blogger.com'
		self.service.ProgrammaticLogin()
		self.blogs = {}
		self.posts = {}
		self.title = ''
		self.blog_id = blog_id

	def bloglist(self) :
		if len(self.blogs) > 0 : 
			return self.blogs
		query = service.Query()
		query.feed = '/feeds/default/blogs'
		feed = self.service.Get(query.ToUri())
		self.blogs = {}

		self.title = feed.title.text
		for entry in feed.entry:
			self.blogs[entry.GetSelfLink().href.split("/")[-1]] = entry.title.text

		return self.blogs

	def postlist(self) :
		feed = self.service.GetFeed('/feeds/' + self.blog_id + '/posts/default')

		self.posts = {}
		for entry in feed.entry:
			m = post_id.match(entry.id.text)
			if(m) :
				self.posts[m.group(1)] = entry.title.text
		return self.posts

	def post(self, entry) :
		self.service.Post(entry, '/feeds/%s/posts/default' % self.blog_id)

	def put(self, entry) :
		self.service.Put(entry, entry.GetEditLink().href)

	def entry(self, id) :
		query = service.Query()
		query.feed = '/feeds/%s/posts/default/%s' % (self.blog_id, id)
		return self.service.Get(query.ToUri())

class Post :
	def __init__(self, fd=None, entry=None) :
		if fd :
			self.read(fd)
		elif entry :
			self.entry = entry
			self.title = entry.title.text
			self.tags = [e.term for e in entry.category]
			if self.entry.control :			
				self.draft = True
			else :
				self.draft = False
			self.content = entry.content.text
		else :
			self.title = ''
			self.tags = ()
			self.draft = True
			self.content = ''

	def fill_entry(self) :
		self.entry.title = atom.Title('xhtml', self.title)
		self.entry.content = atom.Content(content_type='html', text=self.content)

		self.entry.category = []
		for tag in self.tags : # from http://code.activestate.com/recipes/576441/
			category = atom.Category(term=tag, scheme="http://www.blogger.com/atom/ns#")
			self.entry.category.append(category)
			
		if self.draft :
			control = atom.Control()
			control.draft = atom.Draft(text='yes')
			self.entry.control = control

	def newentry(self) :
		self.entry = gdata.GDataEntry()
		self.fill_entry()
		return self.entry
		
	def read(self, fd) :
		content = fd.readlines()
		hdrs = 1
		self.draft = False
		self.tags = ()
		while hdrs :
			hdrs = 0
			if len(content[0]) > 5 and content[0][0:6].lower() == 'title:' :
				self.title = content[0][6:].strip()
				content = content[1:]
				hdrs = 1
			if len(content[0]) > 5 and content[0][0:6].lower() == 'draft:' : 
				# if draft: is present treat it as a draft unless is says draft: no
				self.draft = content[0][6:].strip().lower() != 'no'
				content = content[1:]
				hdrs = 1
			if len(content[0]) > 4 and content[0][0:5].lower() == 'tags:' :
				self.tags = [t.strip() for t in content[0][6:].strip().lower().split(',')]
				content = content[1:]
				hdrs = 1

		self.content = string.join(content, "").strip()

	def update(self, fd) :
		self.read(fd)
		self.fill_entry()
		return self.entry

	def __str__(self) :
		if self.draft :
			d = 'Draft: yes\n'
		else :
			d = ''
		return "Title: %s\n%sTags: %s\n%s" % (self.title, d, string.join(self.tags, ", "), self.content)

def getpw(u) :
	(io, err) = popen2.popen4(('getuserpasswd', 'proto=pass server=www.google.com user=%s' % u))
	return io.read()

if len(sys.argv) > 3 :
	blogger = Blogger(sys.argv[1], getpw(sys.argv[1]), sys.argv[2])
	if sys.argv[3] == "new" :
		post = Post(fd=sys.stdin)
		blogger.post(post.newentry())

	elif sys.argv[3] == "posts" :
		for p in blogger.postlist() :
			print "%s\t%s" % (p, blogger.posts[p])

	elif sys.argv[3] == "update" :
		post = Post(entry=blogger.entry(sys.argv[4]))
		blogger.put(post.update(sys.stdin))
	
	elif sys.argv[3] == "read" :
		if len(sys.argv) > 3 :
			post = Post(entry=blogger.entry(sys.argv[4]))
			print post
else :
	blogger = Blogger(sys.argv[1], getpw(sys.argv[1]))

	if sys.argv[2] == "bloglist" :
		for b in blogger.bloglist() :
			print "%s\t%s" % (b, blogger.blogs[b])

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.