OSDN Git Service

フォトライフへの投稿に成功。疲れた。WsseAtomConnectionの試行錯誤の結果。
[futonwriter/old_trunk.git] / HatenaDiaryClient / Models / Hatena / HatenaFotolife.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.IO;
6 using System.Xml.Linq;
7 using System.Net;
8
9 namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
10 {
11     public class HatenaFotolife
12     {
13         private string userName;
14         private string password;
15
16         public HatenaFotolife(string userName, string password)
17         {
18             this.userName = userName;
19             this.password = password;
20         }
21
22         public FotolifeEntry Upload(string title, string fileName, string folder = null)
23         {
24             string mimeType;
25             #region MIME Type判断
26             switch (Path.GetExtension(fileName).TrimStart('.').ToLower())
27             {
28                 case "jpg":
29                 case "jpeg":
30                     mimeType = "image/jpeg";
31                     break;
32                 case "gif":
33                     mimeType = "image/gif";
34                     break;
35                 case "png":
36                     mimeType = "image/png";
37                     break;
38                 case "bmp":
39                     mimeType = "image/x-bmp";
40                     break;
41                 case "mov":
42                     mimeType = "video/quicktime";
43                     break;
44                 case "mpg":
45                 case "mpeg":
46                 case "m1v":
47                     mimeType = "video/mpeg";
48                     break;
49                 case "wmv":
50                     mimeType = "video/x-ms-wmv";
51                     break;
52                 case "avi":
53                     mimeType = "video/avi";
54                     break;
55                 case "flv":
56                     mimeType = "video/x-flv";
57                     break;
58                 case "3gp":
59                 case "3gpp":
60                     mimeType = "video/3gpp";
61                     break;
62                 case "3g2":
63                     mimeType = "video/3gpp2";
64                     break;
65                 default:
66                     throw new ArgumentException("対応してないファイルです。");
67             } 
68             #endregion
69
70             var entry = new XElement(XmlNamespaces.Atom02Spec + "entry",
71                 new XElement(XmlNamespaces.Atom02Spec + "title", title),
72                 new XElement(XmlNamespaces.Atom02Spec + "content",
73                     new XAttribute("mode", "base64"),
74                     new XAttribute("type", mimeType),
75                     Convert.ToBase64String(File.ReadAllBytes(fileName)))
76             );
77
78             if (!string.IsNullOrEmpty(folder))
79                 entry.Add(new XElement(XmlNamespaces.DublinCore + "subject", folder));
80                         
81             var reXml = WsseAtomConnection.Post(
82                 "http://f.hatena.ne.jp/atom/post",
83                 new XDocument(entry),
84                 Encoding.GetEncoding("shift_jis"),
85                 this.userName,
86                 this.password);
87             return new FotolifeEntry(reXml.Root, false);
88         }
89     }
90 }