Advertisement
Guest User

Source for Youtube Cache (not working)

a guest
Jan 1st, 2013
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.12 KB | None | 0 0
  1. using System;
  2. using System.Net;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. namespace YoutubeCache
  7. {
  8.     class MainClass
  9.     {
  10.         static List<string> DownloadJobs = new List<string> ();
  11.  
  12.         public static void Main (string[] args)
  13.         {
  14.  
  15.             var listener = new HttpListener ();
  16.             Environment.CurrentDirectory = Path.GetDirectoryName (
  17.                 System.Reflection.Assembly.GetExecutingAssembly ().Location);
  18.             listener.Prefixes.Add ("http://*:3949/");
  19.             listener.Start ();
  20.             Console.WriteLine ("Listening on port 3949");
  21.             while (true) {
  22.                 try {
  23.                     var context = listener.GetContext ();
  24.                     string requestString = context.Request.RawUrl;
  25.                     HttpWebRequest request = (HttpWebRequest)WebRequest.Create (requestString);
  26.                     request.KeepAlive = false;
  27.                     request.Proxy.Credentials = CredentialCache.DefaultCredentials;
  28.                     request.Timeout = 200000;
  29.                     request.Method = context.Request.HttpMethod;
  30.                     RequestData requestData = new RequestData (request, context);
  31.                     if (requestString.Contains ("youtube.com/videoplayback")) {
  32.                         requestData.Cache = true;
  33.                         requestData.Signature = GetSignature (requestString);
  34.                         Console.WriteLine ("Youtube Video: " + requestData.Signature);
  35.                         Console.WriteLine (request.Method);
  36.                         foreach(string h in context.Request.Headers)
  37.                         {
  38.                             if(h == "Content-Range" || h == "Range")
  39.                             {
  40.                                 Console.WriteLine ("{0}: {1}",h,context.Request.Headers[h]);
  41.                             }
  42.                         }
  43.                         if(File.Exists (requestData.Signature + "_done"))
  44.                         {
  45.                             request.BeginGetResponse (RespCacheCallback,requestData);
  46.                             Console.WriteLine ("Load from cache");
  47.                         }
  48.                         else
  49.                         {
  50.                             request.BeginGetResponse (RespCallback,requestData);
  51.                             Console.WriteLine ("Save to cache");
  52.                         }
  53.                     }
  54.                     else
  55.                     {
  56.                         request.BeginGetResponse (RespCallback, requestData);
  57.                     }
  58.                 } catch (Exception ex) {
  59.                    
  60.                 }
  61.             }
  62.         }
  63.  
  64.         static string GetSignature (string url)
  65.         {
  66.             int index = url.IndexOf ("&id=") + 4;
  67.             int len =  url.IndexOf ('&',index) - index;
  68.             return GetITag(url) + "_" + url.Substring (index,len);
  69.         }
  70.         static string GetITag (string url)
  71.         {
  72.             int index = url.IndexOf ("&itag=") + 6;
  73.             int len =  url.IndexOf ('&',index) - index;
  74.             return url.Substring (index,len);
  75.         }
  76.         static void RespCacheCallback (IAsyncResult asyncresult)
  77.         {
  78.             RequestData requestData = (RequestData)asyncresult.AsyncState;
  79.             HttpListenerResponse responseOut = requestData.Context.Response;
  80.             using (var cacheFile = File.OpenRead (requestData.Signature)) {
  81.                 var info = ReadInfo (requestData.Signature);
  82.                 if(info.ResponseLength != -1)
  83.                     responseOut.ContentLength64 = info.ResponseLength;
  84.                 responseOut.StatusCode = info.StatusCode;
  85.                 responseOut.Cookies = info.Cookies;
  86.                 responseOut.Headers = info.Headers;
  87.  
  88.                 CopyStream (cacheFile,responseOut.OutputStream);
  89.                 cacheFile.Close ();
  90.                 responseOut.OutputStream.Close ();
  91.             }
  92.         }
  93.         public static void WriteInfo (string signature, SavedResponse response)
  94.         {
  95.             var formatter = new BinaryFormatter();
  96.             using (var file = File.Create (signature + "_info")) {
  97.                 formatter.Serialize (file,response);
  98.             }
  99.         }
  100.         public static SavedResponse ReadInfo (string signature)
  101.         {
  102.             var formatter = new BinaryFormatter ();
  103.             SavedResponse resp;
  104.             using (var file = File.OpenRead (signature + "_info")) {
  105.                 resp = (SavedResponse)formatter.Deserialize (file);
  106.             }
  107.             return resp;
  108.         }
  109.         static void RespCallback (IAsyncResult asyncresult)
  110.         {
  111.             RequestData requestData = (RequestData)asyncresult.AsyncState;
  112.             try {
  113.                 using (HttpWebResponse response = (HttpWebResponse)requestData.Request.EndGetResponse(asyncresult)) {
  114.                     HttpListenerResponse responseOut = requestData.Context.Response;
  115.                     using (var receiveStream = response.GetResponseStream ()) {
  116.                         if (response.ContentLength != -1)
  117.                             responseOut.ContentLength64 = response.ContentLength;
  118.                         responseOut.StatusCode = (int)response.StatusCode;
  119.                         responseOut.Cookies = response.Cookies;
  120.                         responseOut.Headers = response.Headers;
  121.                         if(requestData.Cache)
  122.                         {
  123.                             var info = new SavedResponse(response.ContentLength,
  124.                                                          (int)response.StatusCode,
  125.                                                          response.Cookies,
  126.                                                          response.Headers);
  127.                             WriteInfo (requestData.Signature,info);
  128.                             CopyStreamCache (receiveStream,responseOut.OutputStream,requestData.Signature);
  129.                         }
  130.                         else
  131.                             CopyStream (receiveStream, responseOut.OutputStream);
  132.  
  133.                         responseOut.OutputStream.Close ();
  134.                     }
  135.                    
  136.                 }
  137.             } catch (WebException e) {
  138.                 Console.WriteLine ("Web exception");
  139.                 Console.WriteLine (e.Message);
  140.                 HttpListenerResponse responseOut = requestData.Context.Response;
  141.                 responseOut.StatusCode = (int)HttpStatusCode.NotFound;
  142.                 responseOut.OutputStream.Close ();
  143.             } catch (IOException e) {
  144.                 Console.WriteLine ("Client closed?");
  145.                 Console.WriteLine (e.Message);
  146.             } catch (Exception e) {
  147.                 Console.WriteLine ("Generic Exception");
  148.                 Console.WriteLine (e.Message);
  149.                 Console.WriteLine (e.StackTrace);
  150.             }
  151.         }
  152.  
  153.         public static int CopyStreamCache (Stream input, Stream output, string signature)
  154.         {
  155.             bool stillOpen = true;
  156.             bool download = false;
  157.             Stream stream;
  158.             if (!DownloadJobs.Contains (signature)) {
  159.                 DownloadJobs.Add (signature);
  160.                 stream = File.Create (signature);
  161.                 download = true;
  162.             }
  163.             byte[] buffer = new byte[32768];
  164.             int bytesWritten = 0;
  165.             while (stillOpen && download) {
  166.                 int read = input.Read (buffer, 0, buffer.Length);
  167.                 if (read <= 0)
  168.                     break;
  169.                 if (stillOpen) {
  170.                     try {
  171.                         output.Write (buffer, 0, read);
  172.                     } catch (Exception) {
  173.                         stillOpen = false;
  174.                     }
  175.                 }
  176.                 bytesWritten += read;
  177.                 if (download)
  178.                     stream.Write (buffer, 0, read);
  179.             }
  180.             if (download) {
  181.                 stream.Close ();
  182.                 stream.Dispose ();
  183.                 File.WriteAllText (signature + "_done","");
  184.             }
  185.             return bytesWritten;
  186.  
  187.         }
  188.  
  189.         public static int CopyStream (Stream input, Stream output)
  190.         {
  191.             byte[] buffer = new byte[32768];
  192.             int bytesWritten = 0;
  193.             while (true) {
  194.                 int read = input.Read (buffer, 0, buffer.Length);
  195.                 if (read <= 0)
  196.                     break;
  197.                 output.Write (buffer, 0, read);
  198.                 bytesWritten += read;
  199.             }
  200.             return bytesWritten;
  201.         }
  202.     }
  203.  
  204.     class RequestData
  205.     {
  206.         public HttpWebRequest Request;
  207.         public HttpListenerContext Context;
  208.         public bool Cache = false;
  209.         public string Signature = "";
  210.  
  211.         public RequestData (HttpWebRequest request, HttpListenerContext context)
  212.         {
  213.             Request = request;
  214.             Context = context;
  215.         }
  216.     }
  217.     [Serializable()]
  218.     class SavedResponse
  219.     {
  220.         public long ResponseLength;
  221.         public int StatusCode;
  222.         public CookieCollection Cookies;
  223.         public WebHeaderCollection Headers;
  224.         public SavedResponse() {}
  225.         public SavedResponse(long responseLength, int statusCode, CookieCollection cookies, WebHeaderCollection headers)
  226.         {
  227.             ResponseLength = responseLength;
  228.             StatusCode = statusCode;
  229.             Cookies = cookies;
  230.             Headers = headers;
  231.         }
  232.     }
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement