Aug
28
2006

C# implementation of newMediaObject for the MetaWeblog API

If you have a blog you might know about the MetaWeblog API. I implemented it for Tech Head Brothers portal to be able to post news from a client. Today I am using Live Writer to post on my blog and I also wanted to have the possibility to post news on the new version of Tech Head Brothers portal but with pictures and without the usage of a ftp server.

Checking the API I found a new method that I had not implemented: newMediaObject.

metaWeblog.newMediaObject (blogid, username, password, struct) returns struct

The blogid, username and password params are as in the Blogger API.

The struct must contain at least three elements, name, type and bits.

name is a string, it may be used to determine the name of the file that stores the object, or to display it in a list of objects. It determines how the weblog refers to the object. If the name is the same as an existing object stored in the weblog, it may replace the existing object.

type is a string, it indicates the type of the object, it's a standard MIME type, like audio/mpeg or image/jpeg or video/quicktime.

bits is a base64-encoded binary value containing the content of the object.

The struct may contain other elements, which may or may not be stored by the content management system.

If newMediaObject fails, it throws an error. If it succeeds, it returns a struct, which must contain at least one element, url, which is the url through which the object can be accessed. It must be either an FTP or HTTP url.

I defined in the interface two struct as following:

public struct MediaObjectUrl
{
    public string url;
}

public struct MediaObject
{
    public string name;
    public string type;
    public byte[] bits;
}

Added the method in the IMetaWeblog interface:

[XmlRpcMethod("metaWeblog.newMediaObject",
    Description="Add a media object to a post using the "
                + "metaWeblog API. Returns media url as a string.")]
MediaObjectUrl newMediaObject(
    string blogid,
    string username,
    string password,
    MediaObject mediaObject);

And finally the following implementation:

/// <summary>
/// Post a media object.
/// </summary>
/// <param name="blogid">The blogid.</param>
/// <param name="username">The username.</param>
/// <param name="password">The password.</param>
/// <param name="mediaObject">The media object.</param>
/// <returns>MediaObjectUrl  defining the url of the media</returns>
public MediaObjectUrl newMediaObject(string blogid, 
                                     string username, 
                                     string password, 
                                     MediaObject mediaObject)
{
    if (!ValidUser(username, password))
        throw new XmlRpcFaultException(0, "You have no right to do that.");
 
    string filename = Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, 
                                   "images/" + mediaObject.name);
 
    if (!Directory.Exists(Path.GetDirectoryName(filename)))
        Directory.CreateDirectory(Path.GetDirectoryName(filename));
 
    File.WriteAllBytes(filename, mediaObject.bits);
 
    MediaObjectUrl mediaObjectUrl = new MediaObjectUrl();
    mediaObjectUrl.url = ConfigurationManager.AppSettings["BlogUrl"] + 
                         "/images/" + 
                         mediaObject.name;
 
    return mediaObjectUrl;
}

The good point now is that I am able to let the authors of the site post news with embeded pictures without managing a ftp server. 

Comments (1) -

Herman: Sorry but I don't get your question! I don't know if Windows Live Space supports MetaWeblog API, and neither know if you can upload binary content using Live Writer to Live space.

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About Laurent

Laurent Kempé

Laurent Kempé is the editor, founder, and primary contributor of Tech Head Brothers, a French portal about Microsoft .NET technologies.

He is currently employed by Innoveo Solutions since 10/2007 as a Senior Solution Architect and certified Scrum Master.

Founder, owner and Managing Partner of Jobping, which provides a unique and efficient platform for connecting Microsoft skilled job seekers with employers using Microsoft technologies.

Laurent is awarded by Microsoft since Avril 2002: Most Valuable Professional (MVP).

MVP
Certified ScrumMaster
JetBrains Academy Member

My status

Twitter

Flickr

www.flickr.com
This is a Flickr badge showing public photos and videos from Laurent Kempé. Make your own badge here.

Month List

Page List