Indexera data från youtube och andra källor

2013-04-03

Indexering, Sökning, Lättviktsintegration

Att skapa en Connector för att indexera data från externa system är relativt enkelt i SiteSeeker, givet att den externa källan är hjälpsam.

Genom att blanda er webbplats träffar med videoklipp från t.ex. er Youtube-kanal kan ni leverera ännu mer värde till era besökare.

Introduktion

Denna guide beskriver hur du hämtar data från Youtube och presenterar den på din resultatsida, med hjälp av SiteSeekers .NET-modul. Principerna går dock att applicera på andra datakällor och integrationsmoduler.

Steg 1 - Skapa en feed

Youtube erbjuder ett väldigt trevligt feed-API som du kan använda dig av. I vårt fall nöjer vi oss med en enkel feed, vi anger YouTube i Author-fältet, ökar Number of Results till 50, och väljer RSS 2.0 som feed-format. Det ger oss följande feed:

http://gdata.youtube.com/feeds/api/videos?max-results=50&alt=rss&author=YouTube

Observera att du max kan hämta ut 50 videoklipp åt gången. Använd results starting with-parametern för att hämta fler videos med offset.

Steg 2 - Hämta ut data från feeden och skapa HTML-sidor av resultatet

Vi använder oss av Linq för att strukturera upp datat från vår feed:

using System.Xml.Linq;
using System.Linq;
using System.ServiceModel.Syndication;

//Skapa en dataklass för att spara ner videoegenskaperna
public class YoutubeObject
{
    public string Title;
    public string Url;
    public string Thumbnail;
    public string Description;
}

//URL till din feed
public static string FEED_URL = "http://gdata.youtube.com/feeds/api/videos?max-results=50&alt=rss&author=YouTube";


//Läs in din feed och returnera datat som YoutubeObjects
public static List<YoutubeObject> ReadFeed() 
{
    var xDoc = XDocument.Load(FEED_URL);

    XNamespace media = "http://search.yahoo.com/mrss/";
    XNamespace atom = "http://www.w3.org/2005/Atom";

    var items = xDoc.Descendants(media + "group")
        .Select(i => new YoutubeObject
        {
            Title = i.Element(media + "title").Value,
            Url = i.Element(media + "player").Attribute("url").Value,
            Thumbnail = i.Element(media + "thumbnail").Attribute("url").Value,
            Description = i.Element(media + "description").Value
                    
        }).ToList();
  
    return items;
}

Skapa sedan en webbsida av varje video-objekt, och sedan en samlingssida som länkar till dem alla. Den behöver inte vara vacker utan ska endast besökas av SiteSeekers crawler. En färdig sida ska se ut ungefär så här:

<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
  <meta name="videoUrl" content="[VideoObject.Url]" />
  <meta name="thumbnail" content="[VideoObject.Thumbnail]" />
  <meta name="videoid" content="[VideoID - kan hämtas från videons URL]" />
 </head>
 <body>
  <h1>[VideoObject.Title</h1>
  <p>[VideoObject.Description]</p>
 </body>
</html>

Steg 3 - SiteSeeker admin

Gå in i Siteseeker admin och skapa en startpunkt till din nyskapade samlingssida från Servrar -> Startpunkter.

Gå sedan till fliken Metainformation och skriv in följande för att kunna komma åt dina metadatafält från koden i steg 4:

string:thumbnail
string:videoId
string:videoUrl

Kör nu en full indexering av din nya startpunkt. Du borde nu kunna söka på dina HTML-representationer av videoklippen.

Steg 4 - Designa träfflistan

För att videoklippen ska visas korrekt i träfflistan behöver du överrida HTML-helpern ResultHItTitleAndSnippet och designa deras HTML-kod.

Läs mer om HTMLHelpers här.
public override string ResultHitTitleAndSnippet(SearchHit hit)
{
        var a = new TagBuilder("a");
        a.AddCssClass("ess-hitLink");
        a.MergeAttribute("name", "ess-hitNumber-" + hit.OrdinalNumberInResult);
        
        //Länka till youtube om det är en videoträff, länka annars till webbsidan som vanligt    
        string videoUrl ="";
        hit.MetaAttributes.TryGetValue("videoUrl", out videoUrl);
        if (!String.IsNullOrEmpty(videoUrl))
        {
            a.MergeAttribute("href", videoUrl);
        }
        else
        {
            a.MergeAttribute("href", GetUrl(hit));
        }

        a.MergeAttribute("title", hit.TitleNoFormatting);
        var h2 = this.GetHeadingByLevel(2);
        h2.AddCssClass("ess-hitTitleHeader");
        h2.InnerHtml = hit.Title;
        var snippet = new TagBuilder("p") { InnerHtml = hit.Snippet };
        a.InnerHtml += h2;


        //Använd videoID för att skapa ett embed-objekt.
        string videoID = "";
        hit.MetaAttributes.TryGetValue("videoId", out videoID);
        if (!String.IsNullOrEmpty(videoID))
        {
            var embed = new TagBuilder("iframe");
            embed.MergeAttribute("width", "560");
            embed.MergeAttribute("height", "315");
            embed.MergeAttribute("src", "http://www.youtube.com/embed/" + videoID);
            embed.MergeAttribute("frameborder", "0");
            embed.MergeAttribute("allowfullscreen", "");

            return a.ToString() + new TagBuilder("br") + embed.ToString() + snippet.ToString();
        }

        //Skriv ut träffen som vanligt om det inte är en videoträff.
        return a + snippet.ToString();
}     

Om du istället för embed-objekt endast vill visa en tumnagel kan du ersätta embed-koden med följande:

string imageUrl ="";
hit.MetaAttributes.TryGetValue("thumbnail", out imageUrl);
if (!String.IsNullOrEmpty(imageUrl))
{
    var img = new TagBuilder("img");
    img.MergeAttribute("src", imageUrl);
    img.AddCssClass("ess-thumbnail");
    return a + img.ToString() + snippet.ToString();
}