public async Task Start(string baseurl, string guid, Manifest manifest, Media media, CancellationToken token,IProgress<double> progress)
 {
     this.media = media;
     this.guid = guid;
     this.baseurl = baseurl;
     this.bootstrap = media.Info.Info;
     this.manifest = manifest;
     await InitFile();
     await DoNextFragment();
     progress.Report((double)bootstrap.CurrentFragmentWrite * 100D/(double)bootstrap.FragmentCount);
     token.ThrowIfCancellationRequested();
     await ThreadProcessor(token, progress);
     token.ThrowIfCancellationRequested();
 }
 private KeyValuePair<Media,Quality>? BestMediaFromManifest(Manifest m, Quality q)
 {
     List<Quality> qs = Enum.GetValues(typeof (Quality)).Cast<Quality>().ToList();
     int idx = qs.IndexOf(q);
     do
     {
         foreach (Media a in m.Medias)
         {
             if ((int) a.MetadataInfo.height == q.ToHeight())
             {
                 return new KeyValuePair<Media, Quality>(a,q);
             }
         }
         idx--;
         if (idx>=0)
             q = qs[idx];
     } while (idx==-1);
     return null;
 }