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
{
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);
}
}
}
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
{
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;
{
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);
{
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;
{
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);
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();
+ );
}
}
}
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
{
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("対応してないファイルです。");
}
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<FotolifeEntry> 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(_));
}
}
}
using System;
+using System.Collections.Specialized;
+using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
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);
}
}
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);
{
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