From: azyobuzin Date: Wed, 11 May 2011 10:28:48 +0000 (+0900) Subject: ・フォトライフの対応一応完了 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=41e1624398247ded15c66c77ef9b661dc8a3e6d6;hp=f5bf5f659df1a3d169c28cb5f9aeaae696a5fcc9;p=futonwriter%2Fold_trunk.git ・フォトライフの対応一応完了 ・その他いろいろWsseAtomConnectionとかいじった --- diff --git a/HatenaDiaryClient/Models/Hatena/FotolifeEntry.cs b/HatenaDiaryClient/Models/Hatena/FotolifeEntry.cs index 0fc4a30..bf9555f 100644 --- a/HatenaDiaryClient/Models/Hatena/FotolifeEntry.cs +++ b/HatenaDiaryClient/Models/Hatena/FotolifeEntry.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Xml.Linq; using System.Text.RegularExpressions; +using System.Xml.Linq; namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { @@ -19,26 +17,28 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena public string HatenaSyntax { set; get; } public FotolifeEntry() { } - public FotolifeEntry(XElement xml, bool isRdf) + public FotolifeEntry(XElement xml) { - if (isRdf) - { - //TODO - } - else - { - this.Title = xml.Element(XmlNamespaces.Atom02Spec + "title").Value; - this.PageUri = xml.Elements(XmlNamespaces.Atom02Spec + "link") - .Where(_ => _.Attribute("rel").Value == "alternate") - .Select(_ => _.Attribute("href").Value) - .FirstOrDefault(); - this.Id = Regex.Match(this.PageUri, @"\d+$").ToString(); - this.Issued = DateTime.Parse(xml.Element(XmlNamespaces.Atom02Spec + "issued").Value); - this.Folder = xml.Element(XmlNamespaces.DublinCore + "subject").Value; - this.ImageUri = xml.Element(XmlNamespaces.HatenaNs + "imageurl").Value; - this.ThumbnailUri = xml.Element(XmlNamespaces.HatenaNs + "imageurlsmall").Value; - this.HatenaSyntax = xml.Element(XmlNamespaces.HatenaNs + "syntax").Value; - } + Console.WriteLine(xml.ToString()); + this.Title = xml.Element(XmlNamespaces.Atom02Spec + "title").Value; + this.PageUri = xml.Elements(XmlNamespaces.Atom02Spec + "link") + .Where(_ => _.Attribute("rel").Value == "alternate") + .Select(_ => _.Attribute("href").Value) + .FirstOrDefault(); + this.Id = Regex.Match(this.PageUri, @"\d+$").ToString(); + var issuedXml = xml.Element(XmlNamespaces.Atom02Spec + "issued").Value; + if (!string.IsNullOrWhiteSpace(issuedXml)) + this.Issued = DateTime.Parse(issuedXml); + var folderXml = xml.Element(XmlNamespaces.DublinCore + "subject"); + if (folderXml != null) + this.Folder = folderXml.Value; + this.ImageUri = xml.Element(XmlNamespaces.HatenaNs + "imageurl").Value; + this.ThumbnailUri = xml.Element(XmlNamespaces.HatenaNs + "imageurlsmall").Value; + this.HatenaSyntax = string.Format( + "f:id:{0}:{1}j:image", + xml.Element(XmlNamespaces.Atom02Spec + "author") + .Element(XmlNamespaces.Atom02Spec + "name").Value, + this.Id); } } } diff --git a/HatenaDiaryClient/Models/Hatena/HatenaDiary.cs b/HatenaDiaryClient/Models/Hatena/HatenaDiary.cs index 09c1044..73279f9 100644 --- a/HatenaDiaryClient/Models/Hatena/HatenaDiary.cs +++ b/HatenaDiaryClient/Models/Hatena/HatenaDiary.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; -using System.Net; using System.Text; -using System.Text.RegularExpressions; using System.Xml.Linq; namespace Azyobuzi.HatenaDiaryClient.Models.Hatena @@ -23,6 +22,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { var xdoc = WsseAtomConnection.Get( string.Format("http://d.hatena.ne.jp/{0}/atom/blog?page={1}", this.userName, page), + Encoding.UTF8, this.userName, this.password); var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value; @@ -58,6 +58,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { var xdoc = WsseAtomConnection.Get( string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId), + Encoding.UTF8, this.userName, this.password); return new BlogEntry(xdoc.Root); @@ -89,6 +90,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { var xdoc = WsseAtomConnection.Get( string.Format("http://d.hatena.ne.jp/{0}/atom/draft?page={1}", this.userName, page), + Encoding.UTF8, this.userName, this.password); var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value; @@ -114,6 +116,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { var xdoc = WsseAtomConnection.Get( string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id), + Encoding.UTF8, this.userName, this.password); return new BlogEntry(xdoc.Root); @@ -141,22 +144,22 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena this.password); } - public string PublishDraft(string id) + public BlogEntry PublishDraft(string id) { - var req = (HttpWebRequest)WebRequest.Create(string.Format( - "http://d.hatena.ne.jp/{0}/atom/draft/{1}", - this.userName, - id)); - req.Method = "PUT"; - req.AllowAutoRedirect = false; - req.Headers.Add(WsseAtomConnection.CreateHeader(this.userName, this.password)); - req.Headers.Add("X-HATENA-PUBLISH: 1"); - using (var res = req.GetResponse()) - return Regex.Match( - res.Headers[HttpResponseHeader.Location], - @"\d+/\d+" + return new BlogEntry( + XElement.Parse( + WsseAtomConnection.Put( + string.Format( + "http://d.hatena.ne.jp/{0}/atom/draft/{1}", + this.userName, + id), + new NameValueCollection() { { "X-HATENA-PUBLISH", "1" } }, + null, + Encoding.UTF8, + this.userName, + this.password) ) - .ToString(); + ); } } } diff --git a/HatenaDiaryClient/Models/Hatena/HatenaFotolife.cs b/HatenaDiaryClient/Models/Hatena/HatenaFotolife.cs index cefc45f..bdb6cf9 100644 --- a/HatenaDiaryClient/Models/Hatena/HatenaFotolife.cs +++ b/HatenaDiaryClient/Models/Hatena/HatenaFotolife.cs @@ -1,10 +1,9 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; -using System.IO; using System.Xml.Linq; -using System.Net; namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { @@ -38,30 +37,30 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena case "bmp": mimeType = "image/x-bmp"; break; - case "mov": - mimeType = "video/quicktime"; - break; - case "mpg": - case "mpeg": - case "m1v": - mimeType = "video/mpeg"; - break; - case "wmv": - mimeType = "video/x-ms-wmv"; - break; - case "avi": - mimeType = "video/avi"; - break; - case "flv": - mimeType = "video/x-flv"; - break; - case "3gp": - case "3gpp": - mimeType = "video/3gpp"; - break; - case "3g2": - mimeType = "video/3gpp2"; - break; + //case "mov": + // mimeType = "video/quicktime"; + // break; + //case "mpg": + //case "mpeg": + //case "m1v": + // mimeType = "video/mpeg"; + // break; + //case "wmv": + // mimeType = "video/x-ms-wmv"; + // break; + //case "avi": + // mimeType = "video/avi"; + // break; + //case "flv": + // mimeType = "video/x-flv"; + // break; + //case "3gp": + //case "3gpp": + // mimeType = "video/3gpp"; + // break; + //case "3g2": + // mimeType = "video/3gpp2"; + // break; default: throw new ArgumentException("対応してないファイルです。"); } @@ -84,7 +83,59 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena Encoding.GetEncoding("shift_jis"), this.userName, this.password); - return new FotolifeEntry(reXml.Root, false); + return new FotolifeEntry(reXml.Root); + } + + public FotolifeEntry GetEntry(string id) + { + return new FotolifeEntry( + WsseAtomConnection.Get( + "http://f.hatena.ne.jp/atom/edit/" + id, + Encoding.UTF8, + this.userName, + this.password + ) + .Root + ); + } + + public void EditEntry(string id, string newTitle) + { + WsseAtomConnection.Put( + "http://f.hatena.ne.jp/atom/edit/" + id, + null, + Encoding.GetEncoding("shift_jis").GetBytes( + new XDocument( + new XElement(XmlNamespaces.Atom02Spec + "entry", + new XElement(XmlNamespaces.Atom02Spec + "title", newTitle) + ) + ) + .ToString() + ), + null, + this.userName, + this.password); + } + + public void DeleteEntry(string id) + { + WsseAtomConnection.Delete( + "http://f.hatena.ne.jp/atom/edit/" + id, + this.userName, + this.password); + } + + public IEnumerable GetEntrys(int page = 1) + { + return WsseAtomConnection.Get( + "http://f.hatena.ne.jp/atom/feed?page=" + page.ToString(), + Encoding.UTF8, + this.userName, + this.password + ) + .Root + .Elements(XmlNamespaces.Atom02Spec + "entry") + .Select(_ => new FotolifeEntry(_)); } } } diff --git a/HatenaDiaryClient/Models/Hatena/WsseAtomConnection.cs b/HatenaDiaryClient/Models/Hatena/WsseAtomConnection.cs index d01cc00..d751f52 100644 --- a/HatenaDiaryClient/Models/Hatena/WsseAtomConnection.cs +++ b/HatenaDiaryClient/Models/Hatena/WsseAtomConnection.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Specialized; +using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; @@ -25,13 +27,13 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena userName, digest, Convert.ToBase64String(nonce), created); } - public static XDocument Get(string reqUri, string userName, string password) + public static XDocument Get(string reqUri, Encoding enc, string userName, string password) { using (var wc = new WebClient()) { wc.Headers.Add(CreateHeader(userName, password)); - using (var stream = wc.OpenRead(reqUri)) - return XDocument.Load(stream); + using (var sr = new StreamReader(wc.OpenRead(reqUri), enc ?? Encoding.UTF8)) + return XDocument.Load(sr); } } @@ -49,7 +51,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena req.Method = method; req.Headers.Add(CreateHeader(userName, password)); req.ContentType = "application/x.atom+xml"; - var bs = Encoding.GetEncoding("shift_jis").GetBytes(reqData.ToString()); + var bs = enc.GetBytes(reqData.ToString()); req.ContentLength = bs.Length; using (var stream = req.GetRequestStream()) stream.Write(bs, 0, bs.Length); @@ -66,5 +68,21 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena { return PostOrPut(reqUri, "PUT", reqData, enc, userName, password); } + + public static string Put(string reqUri, NameValueCollection headers, byte[] data, Encoding enc, string userName, string password) + { + var req = WebRequest.Create(reqUri); + req.Method = "PUT"; + req.Headers.Add(CreateHeader(userName, password)); + if (headers != null) + req.Headers.Add(headers); + if (data != null && data.Any()) + { + using (var stream = req.GetRequestStream()) + stream.Write(data, 0, data.Length); + } + using (var sr = new StreamReader(req.GetResponse().GetResponseStream(), enc ?? Encoding.UTF8)) + return sr.ReadToEnd(); + } } } \ No newline at end of file