Thứ Tư, 20 tháng 4, 2011

Create a sample web crawler (auto content)

I'll create a sample project: auto download content from a website using  HtmlAgilityPack and c#


  1. Create new Console project
  2. References HtmlAgilityPack.dll to web application
  3. Create class with content:
  4. In main function type:
  5. Completed
Note: 
  1. class Cralwer source:
    class Crawler
        {
            public string Url
            {
                get;
                set;
            }
            public Crawler() { }
            public Crawler(string Url) {
                this.Url = Url;
            }

            public XDocument GetXDocument()
            {
                HtmlAgilityPack.HtmlWeb doc1 = new HtmlAgilityPack.HtmlWeb();
                doc1.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
                HtmlAgilityPack.HtmlDocument doc2 = doc1.Load(Url);
                doc2.OptionOutputAsXml = true;
                doc2.OptionAutoCloseOnEnd = true;
                doc2.OptionDefaultStreamEncoding = System.Text.Encoding.UTF8;
                XDocument xdoc = XDocument.Parse(doc2.DocumentNode.SelectSingleNode("html").OuterHtml);
                return xdoc;
            }
        }
  2. Main source
static void Main(string[] args)
        {
            string url = "http://vnexpress.net/GL/Xa-hoi/";
            string xmlns = "{http://www.w3.org/1999/xhtml}";
            Crawler cl = new Crawler(url);
            XDocument xdoc = cl.GetXDocument();
            var res = from item in xdoc.Descendants(xmlns + "div")
                      where item.Attribute("class") != null && item.Attribute("class").Value == "folder-news"
                      && item.Element(xmlns + "a") != null
                      //select item;
                      select new
                      {
                          Link = item.Element(xmlns + "a").Attribute("href").Value,
                          Image = item.Element(xmlns + "a").Element(xmlns + "img").Attribute("src").Value,
                          Title = item.Elements(xmlns + "p").ElementAt(0).Element(xmlns + "a").Value,
                          Desc = item.Elements(xmlns + "p").ElementAt(1).Value
                      };
            foreach (var node in res)
            {
                Console.WriteLine(node);
                Console.WriteLine("\n");
            }
            Console.ReadKey();                   
        } 

Done, Wish you success!!

crawler/grap/spider youtube clip using c# and visual studio 2010

crawler/grap/spider youtube clip using c# and visual studio 2010

download code

Idea:


  1. Using c# and visual studio 2010
  2. Using youtube api to get clip
  3. Robot automatic search by keyword, the process repeats until the end of the clip
Action:


  1. Create console project:
  2. Add class: common:
  3. Add class Proccess to get clip:

  4. In Main method:
  5. Build All project and press F5 to run application

    Enter keyword to search video
  6. Finish
Code in project:

common.cs

public class Common
    {
        public static void AddToDb(Google.YouTube.Video vd)
        {            
            try
            {
                //add video to database
                //...
                
                //alert info video added
                Console.WriteLine((Program.Total++).ToString() + ".added: " + vd.Title);
            }
            catch(Exception ex) {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex.Message);
                Console.ResetColor();                
                Console.ReadKey();
            }
            
        }

        
        public static bool Exits(string title) {
            //check exits video in database
            //...
            return false;
        }
    }

Proccess.cs
class Proccess
    {

        YouTubeRequestSettings settings;
        public Proccess() 
        {
            settings = new YouTubeRequestSettings("trungtv", "AI39si7vt0JJIEr_P-vad29ZDxbG4oKsIwCRwrkiNzcxxwAvRhhFgmufPHiIonVSmNv3iPR9Fy-2BbaHyQ3gqUeC0COFpJL_mw");
        }
        /// <summary>
        /// robot 1
        /// </summary>
        /// <param name="keyword"></param>
        /// <returns></returns>
        public Feed<Video> Search(string keyword,bool autoPaging, int numberResult)
        {
            YouTubeRequest request = new YouTubeRequest(settings);

            YouTubeQuery query = new YouTubeQuery(YouTubeQuery.DefaultVideoUri);

            //order results by the number of views (most viewed first)
            query.OrderBy = "viewCount";

            // search for puppies and include restricted content in the search results
            // query.SafeSearch could also be set to YouTubeQuery.SafeSearchValues.Moderate
            query.Query = keyword;
            //query.SafeSearch = YouTubeQuery.SafeSearchValues.None;
            query.NumberToRetrieve = numberResult;

            //query.StartIndex = 1;

            Feed<Video> videoFeed = request.Get<Video>(query);

            videoFeed.AutoPaging = autoPaging;

            return videoFeed;
        }
        /// <summary>
        /// robot 2
        /// </summary>
        /// <param name="playlistID"></param>
        /// <returns></returns>
        public Feed<Video> GetByPlaylistID(string PlaylistID)
        {
            YouTubeRequest request = new YouTubeRequest(settings);
            YouTubeQuery query = new YouTubeQuery("http://gdata.youtube.com/feeds/api/playlists/" + PlaylistID);

            //order results by the number of views (most viewed first)
            query.OrderBy = "viewCount";            

            Feed<Video> videoFeed = request.Get<Video>(query);

            videoFeed.AutoPaging = true;

            return videoFeed;

        }
        /// <summary>
        /// robot 3
        /// </summary>
        /// <param name="userid"></param>
        /// <returns></returns>
        public Feed<Video> GetByUsers(string userid)
        {
            YouTubeRequest request = new YouTubeRequest(settings);
            var feed = request.GetVideoFeed(userid);
            feed.AutoPaging = true;
            return feed;
        }
        /// <summary>
        /// robot 4
        /// </summary>
        /// <param name="ListVideoID">Ex:PO7WwmRQ7HA,PO7WwmRQ7HA,PO7WwmRQ7HA</param>
        /// <returns></returns>
        public List<Video> GetList(string ListVideoID)
        {
            YouTubeRequest request = new YouTubeRequest(settings);

            List<Video> lst = new List<Video>();

            var arr = ListVideoID.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string vid in arr)
            {
                Video video = request.Retrieve<Video>(new Uri("http://gdata.youtube.com/feeds/api/videos/" + vid));
                lst.Add(video);
            }
            return lst;
        }
        /// <summary>
        /// robot 5
        /// </summary>
        /// <param name="vd"></param>
        public void GetVideo(Video vd, int level)
        {
            try
            {
                //check
                if (Common.Exits(vd.Title))
                    return;

                //check category
                bool enable = false;
                foreach (var item in vd.Categories) {
                    if (item.Label!=null && System.Configuration.ConfigurationManager.AppSettings.Get("category_fun").Contains(item.Label))
                    { enable = true; break; }
                }
                if (!enable)
                    return;

                //add to db
                Common.AddToDb(vd);

                //check level
                if (level >= Program.Level_Max)
                    return;
                
                //get video relate
                var lstRelate = new List<Video>();
                foreach (Video item in GetByRelate(vd).Entries)
                {
                    if (!Common.Exits(item.Title))
                        lstRelate.Add(item);
                }
                var crawl_relate = new Crawl(lstRelate, level + 1);
                new System.Threading.Thread(new System.Threading.ThreadStart(crawl_relate.Start)).Start();
                
                //get by users
                var lstUser = new List<Video>();
                foreach (Video item in GetByUsers(vd.Author).Entries)
                {
                    if (!Common.Exits(item.Title))
                        lstUser.Add(item);        
                }
                var crawl_users = new Crawl(lstUser, level + 1);
                new System.Threading.Thread(new System.Threading.ThreadStart(crawl_users.Start)).Start();

            }
            catch { 
                //log
            }
        }
        public PlaylistFeed GetPlayList(string PlaylistID) 
        {
            YouTubeRequest request = new YouTubeRequest(settings);
            YouTubeQuery query = new YouTubeQuery("http://gdata.youtube.com/feeds/api/playlists/" + PlaylistID);
            var pl = request.Service.GetPlaylist(query);
            return pl;
        }
        public Playlist GetPlaylist(PlaylistFeed pl) 
        {
            YouTubeRequest request = new YouTubeRequest(settings);
            var playlist = request.GetPlaylistsFeed(pl.Authors.FirstOrDefault().Name).Entries.Single(c => c.Title == pl.Title.Text);
            return playlist;       
        }
        public Feed<Video> GetByRelate(Video vd)
        {
            YouTubeRequest request = new YouTubeRequest(settings);
            var feed = request.GetRelatedVideos(vd);
            feed.AutoPaging = true;
            return feed;
        }
    }

    class Crawl 
    {
        Video vd;
        List<Video> lst_vd;
        int level;

        public Crawl(Video _vd,int _level) {
            vd = _vd;
            level = _level;
        }
        public Crawl(List<Video> _lstvd, int _level)
        {
            lst_vd = _lstvd;
            level = _level;
        }

        public void Start() {
            foreach (var item in lst_vd)
                new Proccess().GetVideo(item, level);

        }
    }
Program.cs
class Program
    {
        public static int Level = 0;
        public static int Level_Max = 2;
        public static int Total = 1;

        static void Main(string[] args)
        {

            Console.Write("Keyword to crawl: ");

            string key = Console.ReadLine();

            var feed = new Proccess().Search(key, false, 10);

            foreach(Google.YouTube.Video item in feed.Entries)
            {
                new Proccess().GetVideo(item, 0);
            }
            
            Console.ReadKey();
        }

    }
Wish you success! 

Download video from youtube use c# and .net 4.0

Download video from youtube use c# and .net 4.0

download code

Idea:


  1. download html string by url
  2. analytics html string, split string and get title, video url, thumbnail url
Action:


  1. Create new project
  2. Design website UI:
  3. Write code for download info button:
  4. Create sub methods:

  5. press F5 to test:
  6. Link download:
  7. Finish
Code in project:

protected void btnDownload_Click(object sender, EventArgs e)
        {
            string URL = convertUrl(txtUrl.Text.Trim());
            string title_video = "";
            imgThumbnail.ImageUrl  = "http://i1.ytimg.com/vi/" + URL.Replace("http://youtube.com/watch?v=", "") + "/default.jpg";
            imgThumbnail0.ImageUrl = "http://i1.ytimg.com/vi/" + URL.Replace("http://youtube.com/watch?v=", "") + "/0.jpg";
            imgThumbnail1.ImageUrl = "http://i1.ytimg.com/vi/" + URL.Replace("http://youtube.com/watch?v=", "") + "/1.jpg";
            imgThumbnail2.ImageUrl = "http://i1.ytimg.com/vi/" + URL.Replace("http://youtube.com/watch?v=", "") + "/2.jpg";
            hlDownload.NavigateUrl = GetDownloadLink(URL,ref title_video);
            lblTitle.Text = title_video;
        }

        private string convertUrl(string url)
        {
            url = url.Replace("www.youtube.com", "youtube.com");
            if (url.IndexOf("http://youtube.com/v/") >= 0)
            {
                url.Replace("http://youtube.com/v/", "http://youtube.com/watch?v=");
            }
            if (url.IndexOf("http://youtube.com/watch?v=") < 0)
            {
                url = "";
            }
            return (url.Substring(0, url.IndexOf("&")));
        }

        public string GetDownloadLink(string inputurl,ref string title_video)
        {
            string outputurl = "";

            string type = "";
            int size = 0;
            string source;


            var request = (HttpWebRequest)WebRequest.Create(inputurl.ToString());


            var response = (HttpWebResponse)request.GetResponse();

            source = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8).ReadToEnd();

            //get title
            title_video = source.Substring(source.IndexOf("<title>") + 7, source.IndexOf("</title>") - (source.IndexOf("<title>") + 7)).Replace("\n", "").Replace("youtube", "");


            if (source.IndexOf("video_id") > -1)
            {
                if (source.Contains("&fmt_url_map="))
                {
                    source = System.Text.RegularExpressions.Regex.Split(source, "&fmt_url_map=")[1];
                }
                if (source.Contains("\"fmt_url_map\": \""))
                {

                    source = System.Text.RegularExpressions.Regex.Split(source, "\"fmt_url_map\": \"")[1];
                }
            }
            source = HttpUtility.UrlDecode(source).Replace("%2C", ",").Split(new string[] { "http:\\/\\/" }, StringSplitOptions.RemoveEmptyEntries).ElementAt(1);
            source = source.Insert(0, "http://").Replace("|", "");
            source = source.Remove(source.LastIndexOf(","), source.Length - source.LastIndexOf(","));
            if (Convert.ToString(source[source.Length - 1]) == "C")
            {
                source = source.Remove(source.Length - 1, 1);
            }
            if (source.Contains("rv.2.rating"))
            {
                int index = source.IndexOf("\",");
                source = source.Remove(index, source.Length - index);
            }

            source = source.Replace(@"\/", "/");
            source = source.Replace("\\u0026", "&");
            var request2 = (HttpWebRequest)WebRequest.Create(source);
            var response2 = (HttpWebResponse)request2.GetResponse();
            if (response2.ContentType == "video/x-flv")
            {
                type = ".flv";
                outputurl = source;
                size = (int)response2.ContentLength;
            }
            else if (response2.ContentType == "video/mp4")
            {
                type = ".mp4";
                outputurl = source;
                size = (int)response2.ContentLength;
            }
            else
            {
                type = "";
                outputurl = "";
            }

            return outputurl;
        }

Wish you success!

Thứ Ba, 19 tháng 4, 2011

» Asp.net card Marquee show last post

When you find Lượt web can use the many trang Marquee offset to create application scroll text with the new posts for tiết Kiệm not the displayed gian web. Post this my direction path you how to simple execute this. Như DEMO
This is thủ dựng kha simple but with you the new settings can be the problem kho. And here command prompt main also be in the Community hmweb đàn. Write to me nghi direction path sure you will be easy apply for you with than. Trọng html with tag Marquee can help ta execute effect you văn scroll. You can tham khao post Some tag HTML special for than to the tag special and the property of the tag Marquee. Nhắm post to this simple me how to use and truy vấn next DataReaders use directly to display data (You can tham khao post SqlDataReader và tập hợp dữ liệu than to understand about DataReaders). Assuming you with the table TB_News field Basic as NewID, Tiêu đề, mô tả, ... when it ta after write function to display data with 10 log latest scroll effect with text and when user to the mouse di data this does it will stop the, di mouse ra data from the next data it will anyway scroll. Hàm as is write after:

private string GetTopNews()
{
    string strHTML = "";
    strHTML += "<marquee width=\"280px\" height=200  ";
    strHTML += "style=\"border:1px solid #dddddd; padding:5px; text-align:justify; line-height:20px\"  ";
    strHTML += "onmouseover=\"this.stop()\" onmouseout=\"this.start()\" scrollamount=\"2\" scrolldelay=\"1\"    ";
    strHTML += "direction=\"up\" loop=\"infinite\">";
    // Khai báo chuỗi kết nối
    string connectString = @"Server =.\SQL2005;Initial Catalog=DB_News;User ID=sa;Password=****";
    // Khai báo câu truy vấn
    string sql = @"SELECT TOP 10 NewID, Title FROM TB_News ORDER BY NewID desc";
    // Tạo một connection tới máy chủ
    SqlConnection conn = new SqlConnection(connectString);
    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            strHTML += "» <a href='?newsid=" + reader[0] + "'>" + reader[1] + "</a><br>";
        }
        reader.Close();//Đóng SqlDataReader
    }

    catch (SqlException ex)
    {
        Console.WriteLine("Error: " + ex);
    }
    finally
    {
        conn.Close();
    }
    strHTML += "</marquee>";
    return strHTML;
}
In your aspx code as illustrated by the following:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Marrquee_News.aspx.cs" Inherits="Marrquee_News" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<style>
a{color:#333333; text-decoration:none;}
a:hover{color:Maroon; text-decoration: underline;}
</style>
    <title>hmweb Dùng Thẻ Marquee Scoll các bài viết mới</title>
</head>
<body>
    <form id="form1" runat="server">
<div style="border:0px; width:282px; padding:5px; 
            text-align:justify; height:28px; 
            line-height:28px; background-color:#006699; 
            color:#FFFFFF">
            <center>Mới cập nhật</center> <br />
</div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>    
    
    </form>
</body>
</html>
Display:
protected void Page_Load(object sender, EventArgs e)
{
   Label1.Text= GetTopNews();
}

Language Translator Construction Asp.net application services written with asp.net

If you ever use google translation of the text - you can build it. In this article I illustrate how to build your translated text functions like text translation feature that google offers. DEMO
We will use the WebService provided by msdn.microsoft.com. You perform the following steps Step 1: Register AppID. To use the WebService you need a Hotmail account to login. After logging in you create a link http://msdn.microsoft.com/en-us/library/ff512386.aspx AppID. If you are afraid to sign up you can use the AppID that I have available is registered: 3CDF850957DBFFCCE5E0E313B63F38332A01F755. Reality when you already have AppID then you can use the following link to translate the data you need http://api.microsofttranslator.com/v2/Http.svc/Translate?appId = "+ appId +" & text = "+ textvalue +" & from = "+ from +" & to = "+ to; of which is the code you appID registered, textvalue is paragraph text to be translated, from the code language to be translated, to the language code you want to translate. So we will build a form to convert the link with the events on the form. Step 2: Building Form You design the interface from the following:

Code that interface as follows:

<table style="width: 600px;">
    <tr>
        <td>
            Từ: <asp:DropDownList ID="ddlFrom" runat="server">
            <asp:ListItem Text="VietNam" Value="vi"  Selected="True" />
            <asp:ListItem Text="English" Value="en" />
            <asp:ListItem Text="Polish" Value="pl" />
            <asp:ListItem Text="German" Value="de" />
            <asp:ListItem Text="French" Value="fr" />
            <asp:ListItem Text="Swedish" Value="sv" />
            <asp:ListItem Text="Chinese Simplified" Value="zh-cn" />
            </asp:DropDownList>
            Sang: <asp:DropDownList ID="ddlTo" runat="server">
            <asp:ListItem Text="VietNam" Value="vi" />
            <asp:ListItem Text="English" Value="en" Selected="True" />
            <asp:ListItem Text="Polish" Value="pl" />
            <asp:ListItem Text="German" Value="de" />
            <asp:ListItem Text="French" Value="fr" />
            <asp:ListItem Text="Swedish" Value="sv" />
            <asp:ListItem Text="Chinese Simplified" Value="zh-cn" />
            </asp:DropDownList> 
            <asp:Button ID="btnTranslate" runat="server" onclick="btnTranslate_Click" Width="80px" Text="Dịch" />
        </td>
    </tr>
    <tr>
        <td >
            <asp:TextBox ID="txtValue" runat="server" Height="80px" TextMode="MultiLine" 
                Width="600px"></asp:TextBox>
        </td>
    </tr>
    <tr>
        <td>
             <asp:Literal ID="ltTranslatetxt" runat="server"></asp:Literal>
        </td>
    </tr>
</table>

Step 3: Write code: Translate function you write and use it in the button's click event as follows

public void Translate(string textvalue, string from, string to)
    {
        string appId = "3CDF850957DBFFCCE5E0E313B63F38332A01F755";
        string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" + appId + "&text=" + textvalue + "&from=" + from + "&to=" + to;
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);

        WebResponse response = null;
        try
        {
            response = httpWebRequest.GetResponse();
            using (Stream stream = response.GetResponseStream())
            {
                System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
                string translation = (string)dcs.ReadObject(stream);

                ltTranslatetxt.Text = "<b>Bản dịch: </b><br>" + translation + "";
            }
        }
        catch (WebException e)
        {
            txtValue.Text = "Failed to translate";
        }
        finally
        {
            if (response != null)
            {
                response.Close();
                response = null;
            }
        }
    }
    protected void btnTranslate_Click(object sender, EventArgs e)
    {
        Translate(txtValue.Text, ddlFrom.SelectedItem.Value.ToString(), ddlTo.SelectedItem.Value.ToString());
    }

You may notice declaring the library:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;

Trong code trên tôi chỉ minh họa mã ngỗn ngữ của mấy nước, nếu bạn cần bạn có thể lấy mã ngôn ngữ của các quốc gia khác trong danh sách sau đây:

'ALBANIAN' : 'sq',
'ARMENIAN' : 'hy',
'BASQUE' : 'eu',
'BURMESE' : 'my',
'CATALAN' : 'ca',
'CHEROKEE' : 'chr',
'CHINESE' : 'zh',
'CHINESE_SIMPLIFIED' : 'zh-CN',
'CHINESE_TRADITIONAL' : 'zh-TW',
'CORSICAN' : 'co',
'CROATIAN' : 'hr',
'CZECH' : 'cs',
'DANISH' : 'da',
'DHIVEHI' : 'dv',
'DUTCH': 'nl',  
'ENGLISH' : 'en',
'ESPERANTO' : 'eo',
'ESTONIAN' : 'et',
'FAROESE' : 'fo',
'FILIPINO' : 'tl',
'FINNISH' : 'fi',
'FRENCH' : 'fr',
'FRISIAN' : 'fy',
'GALICIAN' : 'gl',
'GEORGIAN' : 'ka',
'GERMAN' : 'de',
'GREEK' : 'el',
'GUJARATI' : 'gu',
'HAITIAN_CREOLE' : 'ht',
'HEBREW' : 'iw',
'HINDI' : 'hi',
'HUNGARIAN' : 'hu',
'ICELANDIC' : 'is',
'INDONESIAN' : 'id',
'INUKTITUT' : 'iu',
'IRISH' : 'ga',
'ITALIAN' : 'it',
'JAPANESE' : 'ja',
'JAVANESE' : 'jw',
'KANNADA' : 'kn',
'KAZAKH' : 'kk',
'KHMER' : 'km',
'KOREAN' : 'ko',
'KURDISH': 'ku',
'KYRGYZ': 'ky',
'LAO' : 'lo',
'LATIN' : 'la',
'LATVIAN' : 'lv',
'LITHUANIAN' : 'lt',
'LUXEMBOURGISH' : 'lb',
'MACEDONIAN' : 'mk',
'MALAY' : 'ms',
'MALAYALAM' : 'ml',
'MALTESE' : 'mt',
'MAORI' : 'mi',
'MARATHI' : 'mr',
'MONGOLIAN' : 'mn',
'NEPALI' : 'ne',
'NORWEGIAN' : 'no',
'OCCITAN' : 'oc',
'ORIYA' : 'or',
'PASHTO' : 'ps',
'PERSIAN' : 'fa',
'POLISH' : 'pl',
'PORTUGUESE' : 'pt',
'PORTUGUESE_PORTUGAL' : 'pt-PT',
'PUNJABI' : 'pa',
'QUECHUA' : 'qu',
'ROMANIAN' : 'ro',
'RUSSIAN' : 'ru',
'SANSKRIT' : 'sa',
'SCOTS_GAELIC' : 'gd',
'SERBIAN' : 'sr',
'SINDHI' : 'sd',
'SINHALESE' : 'si',
'SLOVAK' : 'sk',
'SLOVENIAN' : 'sl',
'SPANISH' : 'es',
'SUNDANESE' : 'su',
'SWAHILI' : 'sw',
'SWEDISH' : 'sv',
'SYRIAC' : 'syr',
'TAJIK' : 'tg',
'TAMIL' : 'ta',
'TATAR' : 'tt',
'TELUGU' : 'te',
'THAI' : 'th',
'TIBETAN' : 'bo',
'TONGA' : 'to',
'TURKISH' : 'tr',
'UKRAINIAN' : 'uk',
'URDU' : 'ur',
'UZBEK' : 'uz',
'UIGHUR' : 'ug',
'VIETNAMESE' : 'vi',
'WELSH' : 'cy',
'YIDDISH' : 'yi',
'YORUBA' : 'yo',
'UNKNOWN' : ''