diff --git a/BizHawk.Emulation.DiscSystem/M3U_file.cs b/BizHawk.Emulation.DiscSystem/M3U_file.cs new file mode 100644 index 0000000000..d3ab3ca119 --- /dev/null +++ b/BizHawk.Emulation.DiscSystem/M3U_file.cs @@ -0,0 +1,102 @@ +using System; +using System.Text; +using System.IO; +using System.Globalization; +using System.Collections.Generic; + +namespace BizHawk.Emulation.DiscSystem +{ + public class M3U_File + { + public static M3U_File Read(StreamReader sr) + { + M3U_File ret = new M3U_File(); + if (!ret.Parse(sr)) + return null; + else return ret; + } + + bool Parse(StreamReader sr) + { + bool ext = false; + int runtime = -1; + string title = null; + for (; ; ) + { + string line = sr.ReadLine(); + if (line == null) + break; + if (line.StartsWith("#")) + { + if (line == "#EXTM3U") + { + ext = true; + continue; + } + if (line.StartsWith("#EXTINF:")) + { + //TODO - maybe we shouldnt be so harsh. should probably add parse options. + if (!ext) continue; + + line = line.Substring(8); + int cidx = line.IndexOf(','); + + //dont know what to do with this, but its a comment, so ignore it + if (cidx == -1) + continue; + + runtime = int.Parse(line.Substring(0, cidx)); + title = line.Substring(cidx); + } + + //just a comment. ignore it + continue; + } + else + { + var e = new Entry { + Path = line, + Runtime = runtime, + Title = title + }; + Entries.Add(e); + runtime = -1; + title = null; + } + } //parse loop + + return true; + } //Parse() + + public List Entries = new List(); + + public void Rebase(string basepath) + { + foreach (var e in Entries) + { + //dont change rooted paths + if (Path.IsPathRooted(e.Path)) continue; + //adjust relative paths + e.Path = Path.Combine(basepath, e.Path); + } + } + + public class Entry + { + public string Path; + + /// + /// if the title is null, it isn't set + /// + public string Title; + + /// + /// if the runtime is -1, it isn't set + /// + public int Runtime; + } + + } //class M3U_File +} + +