C# Dynamic Streaming Video via Handler (.ashx) with Range Downloader ASP MVC

here is the full source class in .ashx file i used.
with following mysite.com/watch.ashx?id=1039 returns a video file.
public class Video : IHttpHandler {
public void RangeDownload(int id, HttpContext context)
{
//connecton to database
VideosDB db = new VideosDB();
//Entity
var get = db.MyvideosDB.FirstOrDefault(p => p.Video == id);
//path to video ile
string fullpath = context.Server.MapPath("~/cdn_users/" + get.Postedby + "/" + get.VideoURL);
long size, start, end, length, fp = 0;
using (StreamReader reader = new StreamReader(fullpath))
{
size = reader.BaseStream.Length;
start = 0;
end = size - 1;
length = size;
context.Response.AddHeader("Accept-Ranges", "0-" + size);
if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"]))
{
long anotherStart = start;
long anotherEnd = end;
string[] arr_split = context.Request.ServerVariables["HTTP_RANGE"].Split(new char[] { Convert.ToChar("=") });
string range = arr_split[1];
if (range.IndexOf(",") > -1)
{
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
throw new HttpException(416, "Requested Range Not Satisfiable");
}
if (range.StartsWith("-"))
{
anotherStart = size - Convert.ToInt64(range.Substring(1));
}
else
{
arr_split = range.Split(new char[] { Convert.ToChar("-") });
anotherStart = Convert.ToInt64(arr_split[0]);
long temp = 0;
anotherEnd = (arr_split.Length > 1 && Int64.TryParse(arr_split[1].ToString(), out temp)) ? Convert.ToInt64(arr_split[1]) : size;
}
anotherEnd = (anotherEnd > end) ? end : anotherEnd;
if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size)
{
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
throw new HttpException(416, "Requested Range Not Satisfiable");
}
start = anotherStart;
end = anotherEnd;
length = end - start + 1;
fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);
context.Response.StatusCode = 206;
}
}
context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
context.Response.AddHeader("Content-Length", length.ToString());
context.Response.WriteFile(fullpath, fp, length);
context.Response.End();
}
public void ProcessRequest(HttpContext context)
{
string id = context.Request["id"];
int newid;
int.TryParse(id, out newid);
VideosDB db = new VideosDB();
var get = db.MyvideosDB.FirstOrDefault(p => p.Video == newid);
string mimetype = "video/mp4";
string fullpath=context.Server.MapPath("/cdn_users/"+get.Postedby+"/"+get.VideoURL);
if (System.IO.File.Exists(fullpath))
{
context.Response.ContentType = mimetype;
if (!String.IsNullOrEmpty(context.Request.ServerVariables["HTTP_RANGE"]))
{
RangeDownload(newid, context);
}
else
{
long fileLength = File.OpenRead(fullpath).Length;
context.Response.AddHeader("Content-Length", fileLength.ToString());
context.Response.WriteFile(fullpath);
}
}
else
{
throw new HttpException(404, "Video Not Found Path:"+fullpath);
}
}
public bool IsReusable {
get {
return false;
}
}
}
Thanks g . Keep Visiting.
ABOUT THE AUTHOR
Hello We are OddThemes, Our name came from the fact that we are UNIQUE. We specialize in designing premium looking fully customizable highly responsive blogger templates. We at OddThemes do carry a philosophy that: Nothing Is Impossible
0 comments:
Post a Comment