Thanks to the Windows Live Spaces Photo Album plugin project at CodePlex, I was able to abstract the code to get Album and Pictures information from a Live Spaces account. This class serves as a helper when generating javascript code for slideshows containing photos stored at Live Spaces.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using HtmlAgilityPack;
using System.Web;
namespace LivePhotoDataProvider
{
public class AlbumInfo
{
public string URL { get; set; }
public string Name { get; set; }
}
public class PhotoInfo
{
public string FullSizeURL { get; set; }
}
public class LivePhotoData
{
public List<AlbumInfo> GetAlbums(string live_spaces_link)
{
List<AlbumInfo> albums = new List<AlbumInfo>();
XmlDocument doc = new XmlDocument();
try
{
doc.Load(live_spaces_link);
}
catch (Exception e)
{
//TODO: handle the exception your way
return albums;
}
// Need to add the MSN namespace that appears in the Live Space RSS feed
XmlNamespaceManager nmgr = new XmlNamespaceManager(doc.NameTable);
nmgr.AddNamespace("live", "http://schemas.microsoft.com/live/spaces/2006/rss/");
nmgr.AddNamespace("cf", "http://www.microsoft.com/schemas/rss/core/2005");
string xml = doc.InnerXml;
XmlNodeList NL = doc.SelectNodes("//item[live:type='photoalbum']", nmgr);
if (NL.Count == 0)
{
//MessageBox.Show("No photo albums were found on this blog, are you sure there are meant to be some?",
// "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
//Invoke(m_hideloading);
return albums;
}
string url_list = "";
// Adds the relevant details to the respective string List and also adds the element
// to the photoalbum combobox
foreach (XmlNode node in NL)
{
string name = node["title"].InnerText;
string url = node["cf:itemRSS"].InnerText;
string code = node["guid"].InnerText;
// Invoke(m_combo1addstring, new object[] { name });
albums.Add(new AlbumInfo() { Name = name, URL = url});
//AlbumCode.Add(code);
//AlbumName.Add(name);
//AlbumUrl.Add(url);
//url_list += GetPicsURLs(url);
}
return albums;
}
public List<PhotoInfo> GetPics(string album_url)
{
List<PhotoInfo> photos = new List<PhotoInfo>();
// Opens the photo album feed
XmlDocument picdoc = new XmlDocument();
try
{
picdoc.Load(album_url);
}
catch (Exception e)
{
//TODO: handle the exception your way
return photos;
}
XmlNodeList piclist = picdoc.SelectNodes("//item");
string url_list = "";
// Gets all the picture information and puts them in the relative lists
foreach (XmlNode node in piclist)
{
string link = node["link"].InnerText;
photos.Add( GetPicFromURL(link));
}
return photos;
}
private PhotoInfo GetPicFromURL(string imageurl)
{
//get xhtml doc
PhotoInfo photo = new PhotoInfo();
HtmlAgilityPack.HtmlDocument picdoc = new HtmlAgilityPack.HtmlDocument();
var response = System.Net.HttpWebRequest.Create(imageurl).GetResponse().GetResponseStream();
try
{
picdoc.Load(response);
}
catch (Exception e)
{
//TODO: handle the exception your way
return photo;
}
string full_imager_url = "";
HtmlNode preview_link = picdoc.DocumentNode.SelectSingleNode("//a[@id='spPreviewLink']");
full_imager_url = preview_link.Attributes["href"].Value;
string decoded = HttpUtility.HtmlDecode(full_imager_url);
photo.FullSizeURL = decoded;
return photo;
}
}
}
You can use the class like this:
LivePhotoData app = new LivePhotoData();
var albums = app.GetAlbums("http://picturethat.spaces.live.com/feed.rss");
foreach (var album in albums)
{
Console.Out.WriteLine(album.Name);
Console.Out.WriteLine(album.URL);
var pics = app.GetPics(album.URL);
foreach (var pic in pics)
{
Console.Out.WriteLine(pic.FullSizeURL);
}
}
Comments