public Download(Uri uri, string key, CookieContainer cc, JObject song) { m_uri = uri; m_key = key; m_cc = cc; m_song = song; song["Status"] = "Opening file"; string filename = (string)song["ArtistName"] + " - " + (string)song["Name"] + ".mp3"; m_logger = new Logger(this.GetType().ToString() + " " + filename); string dst = ""; string path = ""; if (Main.PATH.Length != 0) path = Main.PATH + Path.DirectorySeparatorChar; dst = path + filename; try { m_path = dst; m_fs = new FileStream(dst, FileMode.Create); } catch (Exception ex) { char[] invalf = Path.GetInvalidFileNameChars(); foreach (char c in invalf) filename = filename.Replace(c, '_'); dst = path + filename; try { m_path = dst; m_fs = new FileStream(dst, FileMode.Create); } catch (Exception exc) { for (int i = 0; i < dst.Length; i++) { if (!Char.IsLetterOrDigit(dst[i])) filename = filename.Replace(dst[i], '_'); dst = path + filename; } try { m_path = dst; m_fs = new FileStream(dst, FileMode.Create); } catch (Exception exc2) { throw new Exception("Could not save the file buddy. (" + exc2.Message + ")"); } } } m_logger.Info("Starting download"); song["Status"] = "Starting download"; Segment s = new Segment(uri, cc, key, 0, SEGMENT_SIZE-1, m_path); m_segments.Add(s); s.Progress += new EventHandler(s_Progress); s.HeadersReceived += new Segment.HeadersReceivedHandler(s_HeadersReceived); s.Start(); m_start = DateTime.Now; }
void s_HeadersReceived(object sender, Dictionary<string, string> headers) { string range = headers["Content-Range"]; m_total = Int32.Parse(range.Split('/')[1]); m_song["Total"] = m_total; m_song["Status"] = "Segmenting"; int total = m_total - SEGMENT_SIZE; // already downloaded int i = 0; while (total > 0) { i++; Segment s = new Segment(m_uri, m_cc, m_key, SEGMENT_SIZE * i, SEGMENT_SIZE * i + Math.Min(SEGMENT_SIZE, total) - 1, m_path); m_segments.Add(s); s.Completed += new EventHandler(s_Completed); s.Progress += new EventHandler(s_Progress); s.Start(); total -= SEGMENT_SIZE; } m_logger.Info("Splitted in " + m_segments.Count + " segments"); }