public List <VideoChunk> loadPlaylist(PlaylistM3U8 pl)
        {
            Console.WriteLine("Loading meeting id " + pl.meetingID + " video chunks ...");
            string reCL = webReq.getRequest(pl.chunklist.AbsoluteUri, String.Empty);

            uint i = 0;
            List <VideoChunk> lvc    = new List <VideoChunk>();
            Uri            localPath = pl.getLocalUri();
            RefreshingLine rl        = new RefreshingLine("Creates chunks list...");

            try
            {
                string       line;
                StringReader reader = new StringReader(reCL);
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.StartsWith("media"))
                    {
                        rl.WriteRefreshLine(string.Format("Add chunk number {0}", i));
                        lvc.Add(new VideoChunk(new Uri(localPath.AbsoluteUri + Uri.UnescapeDataString(line))));
                        i++;
                    }
                }
                ;
                rl.NewWriteLine(string.Format("Finsh - added {0} chunks", i));
                return(lvc);
            }
            catch (Exception)
            {
                throw new Exception("Cannot create chunks list");
            }
        }
 public void mergeChunks(PlaylistM3U8 pl, List <VideoChunk> lvc)
 {
     try
     {
         uint           i  = 0;
         RefreshingLine rl = new RefreshingLine(string.Format("Start merging {0} chunkds", lvc.Count));
         using (var outputStream = File.Create("mid_" + pl.meetingID + ".ts"))
         {
             foreach (VideoChunk vc in lvc)
             {
                 string chunkFile = Path.GetFileName(vc.file.AbsolutePath);
                 rl.WriteRefreshLine(string.Format("Merging chunk {0} / {1} / {2:0.00}%", i, chunkFile, ((i++ + 1) / (float)lvc.Count) * 100));
                 using (var inputStream = File.OpenRead(vc.file.LocalPath))
                 {
                     int    readCount;
                     byte[] buffer = new byte[1024];
                     while ((readCount = inputStream.Read(buffer, 0, buffer.Length)) != 0)
                     {
                         outputStream.Write(buffer, 0, readCount);
                     }
                     inputStream.Close();
                     File.Delete(vc.file.LocalPath);
                 }
             }
             outputStream.Close();
             rl.NewWriteLine("Merging is complete");
             Process.Start("mid_" + pl.meetingID + ".ts");
         }
     }
     catch (Exception)
     {
         throw new Exception("Cannot merging chunks");
     }
 }
        static void Main(string[] args)
        {
            ClassBoost cb = new ClassBoost();

            Console.Title = "ClassBoost Downloader / Or Eliyahu / V1.0";
            printTitle();

            Console.Write("Enter username: "******"Enter password: "******"Successfully logged in");
                Console.WriteLine("Enter meeting id:");
                Console.WriteLine("For example https://classboost.co.il/Pages/VideoPage.aspx?MeetingID=XXXXXXX - the number that appears in XX...X");
                if (uint.TryParse(Console.ReadLine(), out mtId))
                {
                    try
                    {
                        PlaylistM3U8      pl  = cb.getMeeting(mtId);
                        List <VideoChunk> lvc = cb.loadPlaylist(pl);
                        lvc = cb.downloadMeeting(pl, lvc);
                        cb.mergeChunks(pl, lvc);
                    }catch (Exception ex)
                    {
                        Console.WriteLine("Error: " + ex.Message);
                    }
                }
                else
                {
                    Console.WriteLine("Meeting id must be a positive number");
                }
            }
            else
            {
                Console.WriteLine("Login error, please run again");
            }
            Console.ReadKey();
        }
        public List <VideoChunk> downloadMeeting(PlaylistM3U8 pl, List <VideoChunk> lvc)
        {
            string            dirName = Path.GetTempPath() + "\\ClassBoostDownloader_" + DateTime.Now.ToFileTime() + "_" + pl.meetingID;
            List <VideoChunk> reLvc   = new List <VideoChunk>();

            if (Directory.CreateDirectory(dirName).Exists)
            {
                try
                {
                    uint           i  = 0;
                    RefreshingLine rl = new RefreshingLine(string.Format("Starting download {0} chunkds", lvc.Count));
                    foreach (VideoChunk vc in lvc)
                    {
                        using (var client = new WebClient())
                        {
                            string chunkFile = Path.GetFileName(vc.file.AbsoluteUri);
                            if (vc.file.Query.Length > 0)
                            {
                                chunkFile = chunkFile.Replace(vc.file.Query, String.Empty);
                            }
                            rl.WriteRefreshLine(string.Format("Download chunk {0} / {1} / {2:0.00}%", i, chunkFile, ((i++ + 1) / (float)lvc.Count) * 100));
                            chunkFile = dirName + "\\" + chunkFile;
                            client.DownloadFile(vc.file, chunkFile);
                            reLvc.Add(new VideoChunk(new Uri(chunkFile)));
                        }
                    }
                    rl.NewWriteLine("Download complete");
                    return(reLvc);
                }
                catch (Exception)
                {
                    throw new Exception("Cannot download chunk");
                }
            }
            else
            {
                throw new Exception("Cannot create download directory");
            }
        }