概要
指定したディレクトリ直下にある、.mp3 .m4a .m4v .mp4 .wma .wmv .jpg をPodCast用のRSSを出力する。
キーワードによる絞り込み、除外フィルタを行う。
コンパイルが必要無いようにASP.NETのWebFormでインラインで記述。
使用言語はC#
IISと.NET Framework 3.5 以上が導入されていること。
使い方
ファイル名に、「やまだ」または「すずき」を含むものを抽出する場合は、keyword=やまだ|すずき を引数で指定する。
逆にフィルタしたい場合は、fillter=やまだ|すずき を指定する。
「やまだ たろう」 「やまだ じろう」 「やまだ さぶろう」 とファイルがあって、さぶろうを除外したい場合は、keyword=やまだ&filter=さぶろう と指定する。
当初、ファイルは非公開ディレクトリに配置してダウンロード用のASPXを介してダウンロードさせようと思ったが、iTunesの場合、URLのファイルの拡張子とメディアタイプが不一致だと、アイテムを表示しないような仕様のため、ダウンロード用のファイルは公開ディレクトリに配置する必要がある。
MVCを使えば、URLを/test/podcast/hoge.mp4 のようにすることが出来るので上手くいけそうだが、ひとまずコンパイルしたくなかったので今回は見送った。
ソース
<%@ Page Language="C#" Debug="true" %> <%@ Import Namespace="System" %> <%@ Import Namespace="System.Text" %> <%@ Import Namespace="System.Web" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Text.RegularExpressions" %> <%@ Import Namespace="System.Linq" %> <%@ Import Namespace="System.Collections.Generic" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.ServiceModel.Syndication" %> <script runat="server"> // タイトル private string castTilte = "Tilte"; //キャストの説明 private string castDescription = "Description"; // 格納ディレクトリ private string searchDir = @"c:\test"; // 配信URL private string castUrl = "http://xxx.xxx.xxx.xxx/test/"; // ファイルタイプ private Dictionary<string, string> fileTypes = new Dictionary<string, string>() { {".mp3", "audio/x-mp3"}, {".m4a", "audio/x-m4a"}, {".m4v", "video/x-m4v"}, {".mp4", "video/x-mp4"}, {".jpg", "video/x-mp4"}, {".wma", "audio/x-ms-wma"}, {".wmv", "video/x-ms-wmv"} }; protected void Page_Load(object sender, EventArgs e) { string keyword = (string) Request.QueryString["keyword"]; string filter = (string) Request.QueryString["filter"]; Response.ContentType = "application/rss+xml"; Response.ContentEncoding = System.Text.Encoding.UTF8; XmlTextWriter xmlWriter = new XmlTextWriter(Response.Output); SyndicationFeed feed = new SyndicationFeed(); feed.Title = new TextSyndicationContent(castTilte); feed.Description = new TextSyndicationContent(castDescription); List<syndicationitem> items = new List<syndicationitem>(); searchFile(searchDir, items, keyword, filter); feed.Items = items; feed.SaveAsRss20(xmlWriter); Response.End(); } // ファイルを検索してフィードアイテムを作成する private void searchFile(string dir, List<syndicationitem>items, string keyword, string filter) { IEnumerable<fileinfo> fileList = Directory.GetFiles(dir, "*.*", System.IO.SearchOption.AllDirectories).Select(x => new FileInfo(x)); Regex keyRegex = new Regex(String.Format(@"({0}).*\.mp3|({0}).*\.m4a|({0}).*\.m4v|({0}).*\.mp4|({0}).*\.wma|({0}).*\.wmv|({0}).*\.jpg", keyword), RegexOptions.IgnoreCase); IEnumerable<fileinfo> keyFiles = null; keyFiles = from file in fileList where keyRegex.IsMatch(file.Name) orderby file.LastWriteTime descending select file; IEnumerable<fileinfo> filterFiles = null; if (filter == null) { filterFiles = keyFiles; } else { Regex filterRegex = new Regex(String.Format(@"^(?!.*({0})).+$", filter), RegexOptions.IgnoreCase); filterFiles = from file in keyFiles where filterRegex.IsMatch(file.Name) orderby file.LastWriteTime descending select file; } foreach (FileInfo target in filterFiles) { string fname = Path.GetFileNameWithoutExtension(target.Name); string extension = target.Extension; string fileType = fileTypes[extension.ToLower()]; SyndicationItem item = new SyndicationItem(); string title = fname; item.Title = new TextSyndicationContent(title); item.PublishDate = new DateTimeOffset(target.LastWriteTime); SyndicationLink link = SyndicationLink.CreateMediaEnclosureLink(new Uri(castUrl + HttpUtility.UrlEncode(fname) + extension), fileType, target.Length); item.Links.Add(link); items.Add(item); } } </script>
0 件のコメント:
コメントを投稿