Генерация мультимедийного RSS-канала (MRSS) в ASP.NET 3.5 - PullRequest
3 голосов
/ 28 мая 2009

IN .NET 3.5 Мне известны классы System.ServiceModel.Syndication, которые могут создавать RSS-каналы Atom 1.0 и RSS 2.0. Кто-нибудь знает способ легко генерировать Yahoo RSS Media в ASP.Net? Я ищу бесплатный и быстрый способ создания канала MRSS.

Ответы [ 4 ]

2 голосов
/ 05 июня 2009

Вот упрощенное решение, которое я использовал в HttpHandler (ashx):

        public void GenerateRss(HttpContext context, IEnumerable<Media> medias)
    {
        context.Response.ContentType = "application/rss+xml";
        XNamespace media = "http://search.yahoo.com/mrss";
        List<Media> videos2xml = medias.ToList();

        XDocument rss = new XDocument(
            new XElement("rss", new XAttribute("version", "2.0"),
                new XElement("channel",
                    new XElement("title", ""),
                    new XElement("link", ""),
                    new XElement("description", ""),
                    new XElement("language", ""),
                    new XElement("pubDate", DateTime.Now.ToString("r")),
                    new XElement("generator", "XLinq"),

                    from v in videos2xml
                    select new XElement("item",
                               new XElement("title", v.Title.Trim()),
                               new XElement("link", "",
                                   new XAttribute("rel", "alternate"),
                                   new XAttribute("type", "text/html"),
                                   new XAttribute("href", String.Format("/Details.aspx?vid={0}", v.ID))),
                               new XElement("id", NotNull(v.ID)),
                               new XElement("pubDate", v.PublishDate.Value.ToLongDateString()),
                               new XElement("description",
                                   new XCData(String.Format("<a href='/Details.aspx?vid={1}'> <img src='/Images/ThumbnailHandler.ashx?vid={1}' align='left' width='120' height='90' style='border: 2px solid #B9D3FE;'/></a><p>{0}</p>", v.Description, v.ID))),
                               new XElement("author", NotNull(v.Owner)),
                               new XElement("link",
                                   new XAttribute("rel", "enclosure"),
                                   new XAttribute("href", String.Format("/Details.aspx?vid={0}", v.ID)),
                                    new XAttribute("type", "video/wmv")),
                               new XElement(XName.Get("title", "http://search.yahoo.com/mrss"), v.Title.Trim()),
                               new XElement(XName.Get("thumbnail", "http://search.yahoo.com/mrss"), "",
                                   new XAttribute("url", String.Format("/Images/ThumbnailHandler.ashx?vid={0}", v.ID)),
                                   new XAttribute("width", "320"),
                                   new XAttribute("height", "240")),
                               new XElement(XName.Get("content", "http://search.yahoo.com/mrss"), "a",
                                    new XAttribute("url", String.Format("/Details.aspx?vid={0}", v.ID)),
                                    new XAttribute("fileSize", Default(v.FileSize)),
                                    new XAttribute("type", "video/wmv"),
                                    new XAttribute("height", Default(v.Height)),
                                    new XAttribute("width", Default(v.Width))
                                    )
                            )
                     )
                )
               );

        using (XmlWriter writer = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8))
        {
            try
            {
                rss.WriteTo(writer);
            }
            catch (Exception ex)
            {
                Log.LogError("VideoRss", "GenerateRss", ex);
            }
        }

    }
1 голос
/ 02 июня 2009

Мне удалось добавить пространство имен мультимедиа в тег rss, выполнив следующие действия:

XmlDocument feedDoc = new XmlDocument();
feedDoc.Load(new StringReader(xmlText));
XmlNode rssNode = feedDoc.DocumentElement;
// You cant directly set the attribute to anything other then then next line. So you have to set the attribute value on a seperate line.
XmlAttribute mediaAttribute = feedDoc.CreateAttribute("xmlns", "media", "http://www.w3.org/2000/xmlns/");
mediaAttribute.Value = "http://search.yahoo.com/mrss/";
rssNode.Attributes.Append(mediaAttribute);

return feedDoc.OuterXml;
1 голос
/ 29 мая 2009

Шаг 1. Конвертируйте ваши данные в XML:

Итак, дан список фотографий:

var photoXml = new XElement("photos",
  new XElement("album",
    new XAttribute("albumId", albumId),
    new XAttribute("albumName", albumName),
    new XAttribute("modified", DateTime.Now.ToUniversalTime().ToString("r")),
      from p in photos
        select
          new XElement("photo",
            new XElement("id", p.PhotoID),
            new XElement("caption", p.Caption),
            new XElement("tags", p.StringTags),
            new XElement("albumId", p.AlbumID),
            new XElement("albumName", p.AlbumName)
            )  // Close element photo
    ) // Close element album
  );// Close element photos

Шаг 2. Запустите XML через некоторый XSLT:

Затем, используя что-то вроде следующего, пропустите через some XSLT , где xslPath - это путь к вашему XSLT, current - это текущий HttpContext:

var xt = new XslCompiledTransform();
xt.Load(xslPath);

var ms = new MemoryStream();

if (null != current){
  var xslArgs = new XsltArgumentList();
  var xh = new XslHelpers(current);
  xslArgs.AddExtensionObject("urn:xh", xh);

  xt.Transform(photoXml.CreateNavigator(), xslArgs, ms);
} else {
  xt.Transform(photoXml.CreateNavigator(), null, ms);
}

// Set the position to the beginning of the stream.
ms.Seek(0, SeekOrigin.Begin);

// Read the bytes from the stream.
var byteArray = new byte[ms.Length];
ms.Read(byteArray, 0, byteArray.Length);

// Decode the byte array into a char array 
var uniEncoding = new UTF8Encoding();
var charArray = new char[uniEncoding.GetCharCount(
    byteArray, 0, byteArray.Length)];
uniEncoding.GetDecoder().GetChars(
    byteArray, 0, byteArray.Length, charArray, 0);
var sb = new StringBuilder();
sb.Append(charArray);

// Returns the XML as a string
return sb.ToString();

У меня есть эти два бита кода в одном методе "BuildPhotoStream".

Класс "XslHelpers" содержит следующее:

public class XslHelpers{
  private readonly HttpContext current;

  public XslHelpers(HttpContext currentContext){
    current = currentContext;
  }

  public String ConvertDateTo822(string dateTime){
    DateTime original = DateTime.Parse(dateTime);

    return original.ToUniversalTime()
      .ToString("ddd, dd MMM yyyy HH:mm:ss G\"M\"T");
  }

  public String ServerName(){
    return current.Request.ServerVariables["Server_Name"];
  }
}

Это в основном дает мне хорошее форматирование дат, которое XSLT не дает мне.

Шаг 3. Отобразить полученный XML-код обратно клиентскому приложению:

"BuildPhotoStream" вызывается "RenderHelpers.Photos" и "RenderHelpers.LatestPhotos", которые отвечают за получение деталей фотографии из объектов Linq2Sql, и они вызываются с пустой страницы aspx (теперь я знаю, что это должно действительно быть обработчиком ASHX, я просто не удосужился его исправить):

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "application/rss+xml";
    ResponseEncoding = "UTF-8";

    if (!string.IsNullOrEmpty(Request.QueryString["AlbumID"]))
    {
      Controls.Add(new LiteralControl(RenderHelpers
        .Photos(Server.MapPath("/xsl/rssPhotos.xslt"), Context)));
    }
    else
    {
      Controls.Add(new LiteralControl(RenderHelpers
        .LatestPhotos(Server.MapPath("/xsl/rssLatestPhotos.xslt"), Context)));
    }
}

В конце всего этого я получаю следующее:

http://www.doodle.co.uk/Albums/Rss.aspx?AlbumID=61

, который работал в Cooliris / PicLens, когда я его настраивал, однако теперь кажется, что он рендерит изображения в плоскости отражения, и когда вы щелкаете по ним, но не в виде стены: (

Если вы пропустили это выше, XSLT можно найти здесь:

http://www.doodle.co.uk/xsl/rssPhotos.xslt

Вам, очевидно, нужно будет отредактировать его в соответствии с вашими потребностями (и открыть его в чем-то вроде Visual Studio - FF скрывает большинство таблиц стилей def, включая xmlns: atom = "http://www.w3.org/2005/Atom" xmlns: media =" http://search.yahoo.com/mrss").

0 голосов
/ 09 апреля 2010

Просто чтобы добавить еще один вариант для дальнейшего использования:

Я создал библиотеку, которая использует классы SyndicationFeed в .NET и позволяет читать и записывать RSS-потоки мультимедиа.

http://mediarss.codeplex.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...