Youtube watch videos and downloader

Đầu tiên, để thực hiện được bài này, bạn cần đọc qua 1 ít kiến thức về WPF (có thể tham khảo tại đây) và xml linq.

Bạn có thể xem trước giao diện của chương trình bên dưới:

Untitled

1

Mình sẽ không nói nhiều về phần download file và cách làm giao diện, mình chỉ nói qua phần lấy video và getlink download.

Phần mềm sử dụng API v2.0 của google kéo về dạng xml, nhưng đây là phiên bản củ tuy vẫn dùng được nhưng nếu các bạn rảnh có thể tìm hiểu các API v3 hoặc mới hơn để sử dụng (đương nhiên sẽ khó sử dụng hơn 1 tí #:) )

Mình sử dụng 2 key API sau:

 private string _ApiKeySearch = "http://gdata.youtube.com/feeds/api/videos?q={0}&alt=rss&start-index={1}&max-results={2}";
 string _ApiPopular = "http://gdata.youtube.com/feeds/api/standardfeeds/most_popular?time=this_week&alt=rss&start-index={0}&max-results={1}";

key API đầu tiên dùng để lấy  danh sách các video có tên gần giống với tên mà bạn nhập vào (đặt ở q={0}, trong dấu ngoặc nhọn). Kết quả sẽ trả về video từ vị trí thứ start-index đến vị trí thứ start-index+max-results

Với key API thứ 2, dùng để lấy video được xem nhiều nhất trong tuần. Bạn có thể thay đổi time=this_week bằng (ALL_TIME, THIS_MONTH, THIS_WEEK, TODAY)

Lưu ý: alt=rss được dùng để trả về dữ liệu kiểu xml.

Sau khi set các biến cho key API, sử dụng XML LINQ để load và tách dữ liệu sau đó lưu vào class chứa thông tin từng video.

xữ lý lấy dữ liệu

private static string GetEmbedUrlFromLink(string link)
 {
     try
     {
        string embedUrl = link.Substring(0, link.IndexOf("&")).Replace("watch?v=", "embed/");
        return embedUrl;
     }
     catch
     {
         return link;
     }
 }
 private static string GetTime(XElement element)
 {
     XElement group = null;
     int time = 0;
     foreach (XElement desc in element.Descendants())
     {
         if (desc.Name.LocalName == "group")
         {
             group = desc;
             break;
         }
      }
      if (group != null)
      {
         foreach (XElement desc in group.Descendants())
         {
            if (desc.Name.LocalName == "duration")
            {
                time = int.Parse(desc.Attribute("seconds").Value.ToString(                        ));
                 break;
            }
         }
      }
      return TimeSpan.FromSeconds(time).ToString();
 }
 private static string GetThumbNailUrlFromLink(XElement element)
 {
     XElement group = null;
     string thumbnailUrl = @"../Images/logo.png";
     foreach (XElement desc in element.Descendants())
     {
         if (desc.Name.LocalName == "group")
        {
             group = desc;
             break;
         }
    }
    if (group != null)
    {
         foreach (XElement desc in group.Descendants())
         {
            if (desc.Name.LocalName == "thumbnail")
           {
               thumbnailUrl = desc.Attribute("url").Value.ToString();
                break;
            }
         }
     }
     return thumbnailUrl;
 }
 private static string GetCountView(XElement element)
 {
    XElement group = null;
    string View = "0";
    foreach (XElement desc in element.Descendants())
    {
       if (desc.Name.LocalName == "statistics")
       {
          group = desc;
          View = desc.Attribute("viewCount").Value;
          break;
       }
     }
     return View;
 }

class YoutubeInfo

public class YouTubeInfo
 {
 public string ViewCount { get; set; }
 public string Author { get; set; }
 public string LinkUrl { get; set; }
 public string EmbedUrl { get; set; }
 public string ThumbNailUrl { get; set; }
 public string Title { get; set; }
 public string Time { get; set; }
 }

sau khi lưu thông tin các video, thông tin này sẽ được đưa vào user controll Result.xaml  (trong thư mục userctrl) để hiển thị và add vào listbox trong Mainwindow.xaml

khi click vào bất kì 1 result controll nào trong listbox sẽ mở ra viewer.xaml ở giữa màn hình và bắt đầu xem.

Để lấy link download video, chương trình sử dụng YoutubeExtractor.dll (search google đê học cách sử dụng và download, hoặc tìm trong file download bên dưới)

 /// <summary>
 /// truyen vao link video dang xem va object= form VideoDownloader 
 /// vd: SetUpLink("http://youtube.com/?watch=vkdsala",VideoDownload);
 /// </summary>
 /// <param name="UrlVideo"></param>
 /// <param name="sender"></param>
public void SetUpLink(string UrlVideo, object sender)
 {
    _VideoDownloader = sender as VideoDownloader;
     _videoInfos = DownloadUrlResolver.GetDownloadUrls(UrlVideo).Where(n => n.Resolution > 0).OrderBy(n => n.Resolution).OrderBy(n => n.VideoExtension).ToList<VideoInfo>();
      foreach (var videoInfor in _videoInfos)
     {
         long size = getSize(videoInfor.DownloadUrl);
          cmbVideo.Items.Add("type:" + videoInfor.VideoExtension + ", Qualiity: " + videoInfor.Resolution + ", Size: " + ConvertSizeVideo(size));
      }
      cmbVideo.SelectedIndex = 0;
      this.Show();
 }
 private static long getSize(string VideoUrl)
 {
     try
     {
         var fileInfoRequest = (HttpWebRequest)HttpWebRequest.Create(VideoUrl);
          var fileInfoResponse = (HttpWebResponse)fileInfoRequest.GetResponse();
         var bytesLength = fileInfoResponse.ContentLength;
         fileInfoRequest.Abort();
         if (bytesLength != -1)
         {
            return bytesLength;
         }
         else return 0;
      }
      catch (Exception)
      {
         return 0;
       }
 }

phần download file bạn có thể tự tìm hiểu trong code của mình, mình có chú thích trong đó rồi !

các bạn có thể download project tại đây.

Phần threading cho cái downloader mình chưa xữ lý tắt thread khi download xong hoặc tắt window, các bạn có thể thêm vào sau :))

My Partner: Khang Nguyễn

Không sử dụng chương trình cho mục đích thương mại !

Please, don’t use this project for commercial !

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s