protected override async Task Process(HttpListenerContext context) { context.AddAccessControlHeaders(); string getRequest = context.Request.Url.AbsolutePath.Remove(0, 1); //Remove first slash Stream input = null; try { var mediastoreKey = HttpUtility.UrlDecode(getRequest.Split('/')[0]); var mediastoreSection = getRequest.Split('/')[1]; var mediastoreItem = getRequest.Split('/')[2]; var mediaStore = new FileMediaStore(mediastoreKey); switch(mediastoreSection){ case "images": input = new FileStream(Path.Combine(this.MediaStoreRoot, mediastoreKey, mediastoreSection, mediaStore.Images[mediastoreItem]), FileMode.Open); context.Response.AddHeader("Content-Type", MimeTypes.GetMimeType(mediaStore.Images[mediastoreItem])); break; case "audio": input = new FileStream(Path.Combine(this.MediaStoreRoot, mediastoreKey, mediastoreSection, mediaStore.Audio[mediastoreItem]), FileMode.Open); context.Response.AddHeader("Content-Type", MimeTypes.GetMimeType(mediaStore.Audio[mediastoreItem])); break; case "video": input = new FileStream(Path.Combine(this.MediaStoreRoot, mediastoreKey, mediastoreSection, mediaStore.Video[mediastoreItem]), FileMode.Open); context.Response.AddHeader("Content-Type", MimeTypes.GetMimeType(mediaStore.Video[mediastoreItem])); break; case "resoruces": input = new FileStream(Path.Combine(this.MediaStoreRoot, mediastoreKey, mediastoreSection, mediaStore.Resources[mediastoreItem]), FileMode.Open); context.Response.AddHeader("Content-Type", MimeTypes.GetMimeType(mediaStore.Resources[mediastoreItem])); break; } } catch { input = new MemoryStream(new UTF8Encoding().GetBytes("404 not found")); } byte[] buffer = new byte[1024 * 16]; int nbytes; //await Task.Run(() => // { while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0) context.Response.OutputStream.Write(buffer, 0, nbytes); // }); input.Close(); context.Response.OutputStream.Close(); }
public IMediaStore ToMediaStore(string mediaStoreKey) { IMediaStore mediaStore = new FileMediaStore(mediaStoreKey); using (var webClient = new WebClient()) { for (int i = 0; i < this.Fanarts.Count; i++) { var fanart = this.Fanarts[i]; string filename = Path.GetFileName(new Uri(fanart).AbsolutePath); try { string downloadPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), $"fanart_{filename}"); webClient.DownloadFile(fanart, downloadPath); mediaStore.Images.Add($"fanart_{i}", downloadPath); } catch { } } for (int i = 0; i < this.Screenshots.Count; i++) { var screenshot = this.Screenshots[i]; string filename = Path.GetFileName(new Uri(screenshot).AbsolutePath); try { string downloadPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), $"screenshot_{filename}"); webClient.DownloadFile(screenshot, downloadPath); mediaStore.Images.Add($"screenshot_{i}", downloadPath); } catch { } } foreach (KeyValuePair<string, string> boxart in this.Boxarts) { string filename = Path.GetFileName(new Uri(boxart.Value).AbsolutePath); try { string downloadPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), $"boxart_{filename}"); webClient.DownloadFile(boxart.Value, downloadPath); mediaStore.Images.Add(boxart.Key.Substring(4), downloadPath);//remove 'img_' prefix } catch { } } } return mediaStore; }
public FileMediaStoreSection(string sectionName, FileMediaStore mediaStore) { this.mediaStoreRoot = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Snowflake", "mediastores", mediaStore.MediaStoreKey, sectionName); this.SectionName = sectionName; this.mediaStoreItems = this.LoadMediaStore(); }