faset over fra Z3950 til google books
This commit is contained in:
202
python/gdata/blogger/__init__.py
Normal file
202
python/gdata/blogger/__init__.py
Normal file
@@ -0,0 +1,202 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Copyright (C) 2007, 2008 Google Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
|
||||
"""Contains extensions to Atom objects used with Blogger."""
|
||||
|
||||
|
||||
__author__ = 'api.jscudder (Jeffrey Scudder)'
|
||||
|
||||
|
||||
import atom
|
||||
import gdata
|
||||
import re
|
||||
|
||||
|
||||
LABEL_SCHEME = 'http://www.blogger.com/atom/ns#'
|
||||
THR_NAMESPACE = 'http://purl.org/syndication/thread/1.0'
|
||||
|
||||
|
||||
class BloggerEntry(gdata.GDataEntry):
|
||||
"""Adds convenience methods inherited by all Blogger entries."""
|
||||
|
||||
blog_name_pattern = re.compile('(http://)(\w*)')
|
||||
blog_id_pattern = re.compile('(tag:blogger.com,1999:blog-)(\w*)')
|
||||
blog_id2_pattern = re.compile('tag:blogger.com,1999:user-(\d+)\.blog-(\d+)')
|
||||
|
||||
def GetBlogId(self):
|
||||
"""Extracts the Blogger id of this blog.
|
||||
This method is useful when contructing URLs by hand. The blog id is
|
||||
often used in blogger operation URLs. This should not be confused with
|
||||
the id member of a BloggerBlog. The id element is the Atom id XML element.
|
||||
The blog id which this method returns is a part of the Atom id.
|
||||
|
||||
Returns:
|
||||
The blog's unique id as a string.
|
||||
"""
|
||||
if self.id.text:
|
||||
match = self.blog_id_pattern.match(self.id.text)
|
||||
if match:
|
||||
return match.group(2)
|
||||
else:
|
||||
return self.blog_id2_pattern.match(self.id.text).group(2)
|
||||
return None
|
||||
|
||||
def GetBlogName(self):
|
||||
"""Finds the name of this blog as used in the 'alternate' URL.
|
||||
An alternate URL is in the form 'http://blogName.blogspot.com/'. For an
|
||||
entry representing the above example, this method would return 'blogName'.
|
||||
|
||||
Returns:
|
||||
The blog's URL name component as a string.
|
||||
"""
|
||||
for link in self.link:
|
||||
if link.rel == 'alternate':
|
||||
return self.blog_name_pattern.match(link.href).group(2)
|
||||
return None
|
||||
|
||||
|
||||
class BlogEntry(BloggerEntry):
|
||||
"""Describes a blog entry in the feed listing a user's blogs."""
|
||||
|
||||
|
||||
def BlogEntryFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(BlogEntry, xml_string)
|
||||
|
||||
|
||||
class BlogFeed(gdata.GDataFeed):
|
||||
"""Describes a feed of a user's blogs."""
|
||||
|
||||
_children = gdata.GDataFeed._children.copy()
|
||||
_children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [BlogEntry])
|
||||
|
||||
|
||||
def BlogFeedFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(BlogFeed, xml_string)
|
||||
|
||||
|
||||
class BlogPostEntry(BloggerEntry):
|
||||
"""Describes a blog post entry in the feed of a blog's posts."""
|
||||
|
||||
post_id_pattern = re.compile('(tag:blogger.com,1999:blog-)(\w*)(.post-)(\w*)')
|
||||
|
||||
def AddLabel(self, label):
|
||||
"""Adds a label to the blog post.
|
||||
|
||||
The label is represented by an Atom category element, so this method
|
||||
is shorthand for appending a new atom.Category object.
|
||||
|
||||
Args:
|
||||
label: str
|
||||
"""
|
||||
self.category.append(atom.Category(scheme=LABEL_SCHEME, term=label))
|
||||
|
||||
def GetPostId(self):
|
||||
"""Extracts the postID string from the entry's Atom id.
|
||||
|
||||
Returns: A string of digits which identify this post within the blog.
|
||||
"""
|
||||
if self.id.text:
|
||||
return self.post_id_pattern.match(self.id.text).group(4)
|
||||
return None
|
||||
|
||||
|
||||
def BlogPostEntryFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(BlogPostEntry, xml_string)
|
||||
|
||||
|
||||
class BlogPostFeed(gdata.GDataFeed):
|
||||
"""Describes a feed of a blog's posts."""
|
||||
|
||||
_children = gdata.GDataFeed._children.copy()
|
||||
_children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [BlogPostEntry])
|
||||
|
||||
|
||||
def BlogPostFeedFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(BlogPostFeed, xml_string)
|
||||
|
||||
|
||||
class InReplyTo(atom.AtomBase):
|
||||
_tag = 'in-reply-to'
|
||||
_namespace = THR_NAMESPACE
|
||||
_attributes = atom.AtomBase._attributes.copy()
|
||||
_attributes['href'] = 'href'
|
||||
_attributes['ref'] = 'ref'
|
||||
_attributes['source'] = 'source'
|
||||
_attributes['type'] = 'type'
|
||||
|
||||
def __init__(self, href=None, ref=None, source=None, type=None,
|
||||
extension_elements=None, extension_attributes=None, text=None):
|
||||
self.href = href
|
||||
self.ref = ref
|
||||
self.source = source
|
||||
self.type = type
|
||||
self.extension_elements = extension_elements or []
|
||||
self.extension_attributes = extension_attributes or {}
|
||||
self.text = text
|
||||
|
||||
|
||||
def InReplyToFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(InReplyTo, xml_string)
|
||||
|
||||
|
||||
class CommentEntry(BloggerEntry):
|
||||
"""Describes a blog post comment entry in the feed of a blog post's
|
||||
comments."""
|
||||
|
||||
_children = BloggerEntry._children.copy()
|
||||
_children['{%s}in-reply-to' % THR_NAMESPACE] = ('in_reply_to', InReplyTo)
|
||||
|
||||
comment_id_pattern = re.compile('.*-(\w*)$')
|
||||
|
||||
def __init__(self, author=None, category=None, content=None,
|
||||
contributor=None, atom_id=None, link=None, published=None, rights=None,
|
||||
source=None, summary=None, control=None, title=None, updated=None,
|
||||
in_reply_to=None, extension_elements=None, extension_attributes=None,
|
||||
text=None):
|
||||
BloggerEntry.__init__(self, author=author, category=category,
|
||||
content=content, contributor=contributor, atom_id=atom_id, link=link,
|
||||
published=published, rights=rights, source=source, summary=summary,
|
||||
control=control, title=title, updated=updated,
|
||||
extension_elements=extension_elements,
|
||||
extension_attributes=extension_attributes, text=text)
|
||||
self.in_reply_to = in_reply_to
|
||||
|
||||
def GetCommentId(self):
|
||||
"""Extracts the commentID string from the entry's Atom id.
|
||||
|
||||
Returns: A string of digits which identify this post within the blog.
|
||||
"""
|
||||
if self.id.text:
|
||||
return self.comment_id_pattern.match(self.id.text).group(1)
|
||||
return None
|
||||
|
||||
|
||||
def CommentEntryFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(CommentEntry, xml_string)
|
||||
|
||||
|
||||
class CommentFeed(gdata.GDataFeed):
|
||||
"""Describes a feed of a blog post's comments."""
|
||||
|
||||
_children = gdata.GDataFeed._children.copy()
|
||||
_children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [CommentEntry])
|
||||
|
||||
|
||||
def CommentFeedFromString(xml_string):
|
||||
return atom.CreateClassFromXMLString(CommentFeed, xml_string)
|
||||
|
||||
|
175
python/gdata/blogger/client.py
Normal file
175
python/gdata/blogger/client.py
Normal file
@@ -0,0 +1,175 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright (C) 2009 Google Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
|
||||
"""Contains a client to communicate with the Blogger servers.
|
||||
|
||||
For documentation on the Blogger API, see:
|
||||
http://code.google.com/apis/blogger/
|
||||
"""
|
||||
|
||||
|
||||
__author__ = 'j.s@google.com (Jeff Scudder)'
|
||||
|
||||
|
||||
import gdata.client
|
||||
import gdata.gauth
|
||||
import gdata.blogger.data
|
||||
import atom.data
|
||||
import atom.http_core
|
||||
|
||||
|
||||
# List user's blogs, takes a user ID, or 'default'.
|
||||
BLOGS_URL = 'http://www.blogger.com/feeds/%s/blogs'
|
||||
# Takes a blog ID.
|
||||
BLOG_POST_URL = 'http://www.blogger.com/feeds/%s/posts/default'
|
||||
# Takes a blog ID.
|
||||
BLOG_PAGE_URL = 'http://www.blogger.com/feeds/%s/pages/default'
|
||||
# Takes a blog ID and post ID.
|
||||
BLOG_POST_COMMENTS_URL = 'http://www.blogger.com/feeds/%s/%s/comments/default'
|
||||
# Takes a blog ID.
|
||||
BLOG_COMMENTS_URL = 'http://www.blogger.com/feeds/%s/comments/default'
|
||||
# Takes a blog ID.
|
||||
BLOG_ARCHIVE_URL = 'http://www.blogger.com/feeds/%s/archive/full'
|
||||
|
||||
|
||||
class BloggerClient(gdata.client.GDClient):
|
||||
api_version = '2'
|
||||
auth_service = 'blogger'
|
||||
auth_scopes = gdata.gauth.AUTH_SCOPES['blogger']
|
||||
|
||||
def get_blogs(self, user_id='default', auth_token=None,
|
||||
desired_class=gdata.blogger.data.BlogFeed, **kwargs):
|
||||
return self.get_feed(BLOGS_URL % user_id, auth_token=auth_token,
|
||||
desired_class=desired_class, **kwargs)
|
||||
|
||||
GetBlogs = get_blogs
|
||||
|
||||
def get_posts(self, blog_id, auth_token=None,
|
||||
desired_class=gdata.blogger.data.BlogPostFeed, query=None,
|
||||
**kwargs):
|
||||
return self.get_feed(BLOG_POST_URL % blog_id, auth_token=auth_token,
|
||||
desired_class=desired_class, query=query, **kwargs)
|
||||
|
||||
GetPosts = get_posts
|
||||
|
||||
def get_pages(self, blog_id, auth_token=None,
|
||||
desired_class=gdata.blogger.data.BlogPageFeed, query=None,
|
||||
**kwargs):
|
||||
return self.get_feed(BLOG_PAGE_URL % blog_id, auth_token=auth_token,
|
||||
desired_class=desired_class, query=query, **kwargs)
|
||||
|
||||
GetPages = get_pages
|
||||
|
||||
def get_post_comments(self, blog_id, post_id, auth_token=None,
|
||||
desired_class=gdata.blogger.data.CommentFeed,
|
||||
query=None, **kwargs):
|
||||
return self.get_feed(BLOG_POST_COMMENTS_URL % (blog_id, post_id),
|
||||
auth_token=auth_token, desired_class=desired_class,
|
||||
query=query, **kwargs)
|
||||
|
||||
GetPostComments = get_post_comments
|
||||
|
||||
def get_blog_comments(self, blog_id, auth_token=None,
|
||||
desired_class=gdata.blogger.data.CommentFeed,
|
||||
query=None, **kwargs):
|
||||
return self.get_feed(BLOG_COMMENTS_URL % blog_id, auth_token=auth_token,
|
||||
desired_class=desired_class, query=query, **kwargs)
|
||||
|
||||
GetBlogComments = get_blog_comments
|
||||
|
||||
def get_blog_archive(self, blog_id, auth_token=None, **kwargs):
|
||||
return self.get_feed(BLOG_ARCHIVE_URL % blog_id, auth_token=auth_token,
|
||||
**kwargs)
|
||||
|
||||
GetBlogArchive = get_blog_archive
|
||||
|
||||
def add_post(self, blog_id, title, body, labels=None, draft=False,
|
||||
auth_token=None, title_type='text', body_type='html', **kwargs):
|
||||
# Construct an atom Entry for the blog post to be sent to the server.
|
||||
new_entry = gdata.blogger.data.BlogPost(
|
||||
title=atom.data.Title(text=title, type=title_type),
|
||||
content=atom.data.Content(text=body, type=body_type))
|
||||
if labels:
|
||||
for label in labels:
|
||||
new_entry.add_label(label)
|
||||
if draft:
|
||||
new_entry.control = atom.data.Control(draft=atom.data.Draft(text='yes'))
|
||||
return self.post(new_entry, BLOG_POST_URL % blog_id, auth_token=auth_token, **kwargs)
|
||||
|
||||
AddPost = add_post
|
||||
|
||||
def add_page(self, blog_id, title, body, draft=False, auth_token=None,
|
||||
title_type='text', body_type='html', **kwargs):
|
||||
new_entry = gdata.blogger.data.BlogPage(
|
||||
title=atom.data.Title(text=title, type=title_type),
|
||||
content=atom.data.Content(text=body, type=body_type))
|
||||
if draft:
|
||||
new_entry.control = atom.data.Control(draft=atom.data.Draft(text='yes'))
|
||||
return self.post(new_entry, BLOG_PAGE_URL % blog_id, auth_token=auth_token, **kwargs)
|
||||
|
||||
AddPage = add_page
|
||||
|
||||
def add_comment(self, blog_id, post_id, body, auth_token=None,
|
||||
title_type='text', body_type='html', **kwargs):
|
||||
new_entry = gdata.blogger.data.Comment(
|
||||
content=atom.data.Content(text=body, type=body_type))
|
||||
return self.post(new_entry, BLOG_POST_COMMENTS_URL % (blog_id, post_id),
|
||||
auth_token=auth_token, **kwargs)
|
||||
|
||||
AddComment = add_comment
|
||||
|
||||
def update(self, entry, auth_token=None, **kwargs):
|
||||
# The Blogger API does not currently support ETags, so for now remove
|
||||
# the ETag before performing an update.
|
||||
old_etag = entry.etag
|
||||
entry.etag = None
|
||||
response = gdata.client.GDClient.update(self, entry,
|
||||
auth_token=auth_token, **kwargs)
|
||||
entry.etag = old_etag
|
||||
return response
|
||||
|
||||
Update = update
|
||||
|
||||
def delete(self, entry_or_uri, auth_token=None, **kwargs):
|
||||
if isinstance(entry_or_uri, (str, unicode, atom.http_core.Uri)):
|
||||
return gdata.client.GDClient.delete(self, entry_or_uri,
|
||||
auth_token=auth_token, **kwargs)
|
||||
# The Blogger API does not currently support ETags, so for now remove
|
||||
# the ETag before performing a delete.
|
||||
old_etag = entry_or_uri.etag
|
||||
entry_or_uri.etag = None
|
||||
response = gdata.client.GDClient.delete(self, entry_or_uri,
|
||||
auth_token=auth_token, **kwargs)
|
||||
# TODO: if GDClient.delete raises and exception, the entry's etag may be
|
||||
# left as None. Should revisit this logic.
|
||||
entry_or_uri.etag = old_etag
|
||||
return response
|
||||
|
||||
Delete = delete
|
||||
|
||||
|
||||
class Query(gdata.client.Query):
|
||||
|
||||
def __init__(self, order_by=None, **kwargs):
|
||||
gdata.client.Query.__init__(self, **kwargs)
|
||||
self.order_by = order_by
|
||||
|
||||
def modify_request(self, http_request):
|
||||
gdata.client._add_query_param('orderby', self.order_by, http_request)
|
||||
gdata.client.Query.modify_request(self, http_request)
|
||||
|
||||
ModifyRequest = modify_request
|
168
python/gdata/blogger/data.py
Normal file
168
python/gdata/blogger/data.py
Normal file
@@ -0,0 +1,168 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright (C) 2009 Google Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
|
||||
"""Data model classes for parsing and generating XML for the Blogger API."""
|
||||
|
||||
|
||||
__author__ = 'j.s@google.com (Jeff Scudder)'
|
||||
|
||||
|
||||
import re
|
||||
import urlparse
|
||||
import atom.core
|
||||
import gdata.data
|
||||
|
||||
|
||||
LABEL_SCHEME = 'http://www.blogger.com/atom/ns#'
|
||||
THR_TEMPLATE = '{http://purl.org/syndication/thread/1.0}%s'
|
||||
|
||||
BLOG_NAME_PATTERN = re.compile('(http://)(\w*)')
|
||||
BLOG_ID_PATTERN = re.compile('(tag:blogger.com,1999:blog-)(\w*)')
|
||||
BLOG_ID2_PATTERN = re.compile('tag:blogger.com,1999:user-(\d+)\.blog-(\d+)')
|
||||
POST_ID_PATTERN = re.compile(
|
||||
'(tag:blogger.com,1999:blog-)(\w*)(.post-)(\w*)')
|
||||
PAGE_ID_PATTERN = re.compile(
|
||||
'(tag:blogger.com,1999:blog-)(\w*)(.page-)(\w*)')
|
||||
COMMENT_ID_PATTERN = re.compile('.*-(\w*)$')
|
||||
|
||||
|
||||
class BloggerEntry(gdata.data.GDEntry):
|
||||
"""Adds convenience methods inherited by all Blogger entries."""
|
||||
|
||||
def get_blog_id(self):
|
||||
"""Extracts the Blogger id of this blog.
|
||||
|
||||
This method is useful when contructing URLs by hand. The blog id is
|
||||
often used in blogger operation URLs. This should not be confused with
|
||||
the id member of a BloggerBlog. The id element is the Atom id XML element.
|
||||
The blog id which this method returns is a part of the Atom id.
|
||||
|
||||
Returns:
|
||||
The blog's unique id as a string.
|
||||
"""
|
||||
if self.id.text:
|
||||
match = BLOG_ID_PATTERN.match(self.id.text)
|
||||
if match:
|
||||
return match.group(2)
|
||||
else:
|
||||
return BLOG_ID2_PATTERN.match(self.id.text).group(2)
|
||||
return None
|
||||
|
||||
GetBlogId = get_blog_id
|
||||
|
||||
def get_blog_name(self):
|
||||
"""Finds the name of this blog as used in the 'alternate' URL.
|
||||
|
||||
An alternate URL is in the form 'http://blogName.blogspot.com/'. For an
|
||||
entry representing the above example, this method would return 'blogName'.
|
||||
|
||||
Returns:
|
||||
The blog's URL name component as a string.
|
||||
"""
|
||||
for link in self.link:
|
||||
if link.rel == 'alternate':
|
||||
return urlparse.urlparse(link.href)[1].split(".", 1)[0]
|
||||
return None
|
||||
|
||||
GetBlogName = get_blog_name
|
||||
|
||||
|
||||
class Blog(BloggerEntry):
|
||||
"""Represents a blog which belongs to the user."""
|
||||
|
||||
|
||||
class BlogFeed(gdata.data.GDFeed):
|
||||
entry = [Blog]
|
||||
|
||||
|
||||
class BlogPost(BloggerEntry):
|
||||
"""Represents a single post on a blog."""
|
||||
|
||||
def add_label(self, label):
|
||||
"""Adds a label to the blog post.
|
||||
|
||||
The label is represented by an Atom category element, so this method
|
||||
is shorthand for appending a new atom.Category object.
|
||||
|
||||
Args:
|
||||
label: str
|
||||
"""
|
||||
self.category.append(atom.data.Category(scheme=LABEL_SCHEME, term=label))
|
||||
|
||||
AddLabel = add_label
|
||||
|
||||
def get_post_id(self):
|
||||
"""Extracts the postID string from the entry's Atom id.
|
||||
|
||||
Returns: A string of digits which identify this post within the blog.
|
||||
"""
|
||||
if self.id.text:
|
||||
return POST_ID_PATTERN.match(self.id.text).group(4)
|
||||
return None
|
||||
|
||||
GetPostId = get_post_id
|
||||
|
||||
|
||||
class BlogPostFeed(gdata.data.GDFeed):
|
||||
entry = [BlogPost]
|
||||
|
||||
|
||||
class BlogPage(BloggerEntry):
|
||||
"""Represents a single page on a blog."""
|
||||
|
||||
def get_page_id(self):
|
||||
"""Extracts the pageID string from entry's Atom id.
|
||||
|
||||
Returns: A string of digits which identify this post within the blog.
|
||||
"""
|
||||
if self.id.text:
|
||||
return PAGE_ID_PATTERN.match(self.id.text).group(4)
|
||||
return None
|
||||
|
||||
GetPageId = get_page_id
|
||||
|
||||
|
||||
class BlogPageFeed(gdata.data.GDFeed):
|
||||
entry = [BlogPage]
|
||||
|
||||
|
||||
class InReplyTo(atom.core.XmlElement):
|
||||
_qname = THR_TEMPLATE % 'in-reply-to'
|
||||
href = 'href'
|
||||
ref = 'ref'
|
||||
source = 'source'
|
||||
type = 'type'
|
||||
|
||||
|
||||
class Comment(BloggerEntry):
|
||||
"""Blog post comment entry in a feed listing comments on a post or blog."""
|
||||
in_reply_to = InReplyTo
|
||||
|
||||
def get_comment_id(self):
|
||||
"""Extracts the commentID string from the entry's Atom id.
|
||||
|
||||
Returns: A string of digits which identify this post within the blog.
|
||||
"""
|
||||
if self.id.text:
|
||||
return COMMENT_ID_PATTERN.match(self.id.text).group(1)
|
||||
return None
|
||||
|
||||
GetCommentId = get_comment_id
|
||||
|
||||
|
||||
class CommentFeed(gdata.data.GDFeed):
|
||||
entry = [Comment]
|
142
python/gdata/blogger/service.py
Normal file
142
python/gdata/blogger/service.py
Normal file
@@ -0,0 +1,142 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# Copyright (C) 2007 Google Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
"""Classes to interact with the Blogger server."""
|
||||
|
||||
__author__ = 'api.jscudder (Jeffrey Scudder)'
|
||||
|
||||
import gdata.service
|
||||
import gdata.blogger
|
||||
|
||||
|
||||
class BloggerService(gdata.service.GDataService):
|
||||
|
||||
def __init__(self, email=None, password=None, source=None,
|
||||
server='www.blogger.com', **kwargs):
|
||||
"""Creates a client for the Blogger service.
|
||||
|
||||
Args:
|
||||
email: string (optional) The user's email address, used for
|
||||
authentication.
|
||||
password: string (optional) The user's password.
|
||||
source: string (optional) The name of the user's application.
|
||||
server: string (optional) The name of the server to which a connection
|
||||
will be opened. Default value: 'www.blogger.com'.
|
||||
**kwargs: The other parameters to pass to gdata.service.GDataService
|
||||
constructor.
|
||||
"""
|
||||
gdata.service.GDataService.__init__(
|
||||
self, email=email, password=password, service='blogger', source=source,
|
||||
server=server, **kwargs)
|
||||
|
||||
def GetBlogFeed(self, uri=None):
|
||||
"""Retrieve a list of the blogs to which the current user may manage."""
|
||||
if not uri:
|
||||
uri = '/feeds/default/blogs'
|
||||
return self.Get(uri, converter=gdata.blogger.BlogFeedFromString)
|
||||
|
||||
def GetBlogCommentFeed(self, blog_id=None, uri=None):
|
||||
"""Retrieve a list of the comments for this blog."""
|
||||
if blog_id:
|
||||
uri = '/feeds/%s/comments/default' % blog_id
|
||||
return self.Get(uri, converter=gdata.blogger.CommentFeedFromString)
|
||||
|
||||
def GetBlogPostFeed(self, blog_id=None, uri=None):
|
||||
if blog_id:
|
||||
uri = '/feeds/%s/posts/default' % blog_id
|
||||
return self.Get(uri, converter=gdata.blogger.BlogPostFeedFromString)
|
||||
|
||||
def GetPostCommentFeed(self, blog_id=None, post_id=None, uri=None):
|
||||
"""Retrieve a list of the comments for this particular blog post."""
|
||||
if blog_id and post_id:
|
||||
uri = '/feeds/%s/%s/comments/default' % (blog_id, post_id)
|
||||
return self.Get(uri, converter=gdata.blogger.CommentFeedFromString)
|
||||
|
||||
def AddPost(self, entry, blog_id=None, uri=None):
|
||||
if blog_id:
|
||||
uri = '/feeds/%s/posts/default' % blog_id
|
||||
return self.Post(entry, uri,
|
||||
converter=gdata.blogger.BlogPostEntryFromString)
|
||||
|
||||
def UpdatePost(self, entry, uri=None):
|
||||
if not uri:
|
||||
uri = entry.GetEditLink().href
|
||||
return self.Put(entry, uri,
|
||||
converter=gdata.blogger.BlogPostEntryFromString)
|
||||
|
||||
def DeletePost(self, entry=None, uri=None):
|
||||
if not uri:
|
||||
uri = entry.GetEditLink().href
|
||||
return self.Delete(uri)
|
||||
|
||||
def AddComment(self, comment_entry, blog_id=None, post_id=None, uri=None):
|
||||
"""Adds a new comment to the specified blog post."""
|
||||
if blog_id and post_id:
|
||||
uri = '/feeds/%s/%s/comments/default' % (blog_id, post_id)
|
||||
return self.Post(comment_entry, uri,
|
||||
converter=gdata.blogger.CommentEntryFromString)
|
||||
|
||||
def DeleteComment(self, entry=None, uri=None):
|
||||
if not uri:
|
||||
uri = entry.GetEditLink().href
|
||||
return self.Delete(uri)
|
||||
|
||||
|
||||
class BlogQuery(gdata.service.Query):
|
||||
|
||||
def __init__(self, feed=None, params=None, categories=None, blog_id=None):
|
||||
"""Constructs a query object for the list of a user's Blogger blogs.
|
||||
|
||||
Args:
|
||||
feed: str (optional) The beginning of the URL to be queried. If the
|
||||
feed is not set, and there is no blog_id passed in, the default
|
||||
value is used ('/feeds/default/blogs').
|
||||
params: dict (optional)
|
||||
categories: list (optional)
|
||||
blog_id: str (optional)
|
||||
"""
|
||||
if not feed and blog_id:
|
||||
feed = '/feeds/default/blogs/%s' % blog_id
|
||||
elif not feed:
|
||||
feed = '/feeds/default/blogs'
|
||||
gdata.service.Query.__init__(self, feed=feed, params=params,
|
||||
categories=categories)
|
||||
|
||||
|
||||
class BlogPostQuery(gdata.service.Query):
|
||||
|
||||
def __init__(self, feed=None, params=None, categories=None, blog_id=None,
|
||||
post_id=None):
|
||||
if not feed and blog_id and post_id:
|
||||
feed = '/feeds/%s/posts/default/%s' % (blog_id, post_id)
|
||||
elif not feed and blog_id:
|
||||
feed = '/feeds/%s/posts/default' % blog_id
|
||||
gdata.service.Query.__init__(self, feed=feed, params=params,
|
||||
categories=categories)
|
||||
|
||||
|
||||
class BlogCommentQuery(gdata.service.Query):
|
||||
|
||||
def __init__(self, feed=None, params=None, categories=None, blog_id=None,
|
||||
post_id=None, comment_id=None):
|
||||
if not feed and blog_id and comment_id:
|
||||
feed = '/feeds/%s/comments/default/%s' % (blog_id, comment_id)
|
||||
elif not feed and blog_id and post_id:
|
||||
feed = '/feeds/%s/%s/comments/default' % (blog_id, post_id)
|
||||
elif not feed and blog_id:
|
||||
feed = '/feeds/%s/comments/default' % blog_id
|
||||
gdata.service.Query.__init__(self, feed=feed, params=params,
|
||||
categories=categories)
|
Reference in New Issue
Block a user