protected void Page_Load(object sender, EventArgs e)
        {
            // this whole page probably qualifies for The Daily WTF, but I'm not a ASP.NET coder and I don't have enough time to learn it. Suggestions and patches welcome.
            if (!Authentication.authenticate(HttpContext.Current))
                return;

            Configuration config = new Configuration();
            MediaStream remoteControl = new MediaStream();
            SetupStreamTable(remoteControl, config);
            SetupRecordingTable(remoteControl, config);

            LogPath.Text = Log.LogPath;
            Config.Text = config.ConfigPath;
            TranscoderLogPath.Text = System.IO.Path.Combine(config.BasePath, "transcoderlogs");
        }
        private string GetRecordingPlayList(MediaStream remoteControl, Configuration config, int transcoderId, int recordingId)
        {
            StringBuilder builder = new StringBuilder();
            foreach (Recording rec in remoteControl.GetRecordings()) {
                if (recordingId != 0 && rec.Id != recordingId)
                    continue;

                foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                    // show all transcoders, except when transcoderId is given
                    if (transcoderId != 0 && transcoder.Id != transcoderId)
                        continue;
                    string name = rec.Title + " (" + rec.StartTime.ToShortDateString() + " " + rec.StartTime.ToShortTimeString() +
                        (transcoderId == 0 ? ", " + transcoder.Name + ")" : ")");
                    string streamurl = remoteControl.GetTranscodedRecordingStreamUrl(rec.Id, config.Username, config.Password, transcoder.Id);
                    WriteEntry(builder, name, streamurl);
                }
            }

            return builder.ToString();
        }
        private string GetChannelPlayList(MediaStream remoteControl, Configuration config, int transcoderId, int channelId)
        {
            StringBuilder builder = new StringBuilder();
            foreach (Channel channel in remoteControl.GetChannels()) {
                // show all channels, except when channelId is given
                if (channelId != 0 && channel.IdChannel != channelId)
                    continue;

                foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                    // show all transcoders, except when transcoderId is given
                    if (transcoderId != 0 && transcoder.Id != transcoderId)
                        continue;
                    string name = channel.Name + (transcoderId == 0 ? " (" + transcoder.Name + ")" : "");
                    string streamurl = remoteControl.GetTranscodedTvStreamUrl(channel.IdChannel, config.Username, config.Password, transcoder.Id);
                    WriteEntry(builder, name, streamurl);
                }
            }

            return builder.ToString();
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Authentication.authenticate(HttpContext.Current))
                return;

            Configuration config = new Configuration();
            MediaStream remoteControl = new MediaStream();
            int transcoderId = 0;
            Int32.TryParse(HttpContext.Current.Request.Params["transcoder"], out transcoderId);
            int channelId = 0;
            Int32.TryParse(HttpContext.Current.Request.Params["channel"], out channelId);
            int recordingId = 0;
            Int32.TryParse(HttpContext.Current.Request.Params["recording"], out recordingId);

            Response.ContentType = "audio/x-mpegurl";
            Response.Write("#EXTM3U\r\n");
            if(recordingId == 0) {
                Response.Write(GetChannelPlayList(remoteControl, config, transcoderId, channelId));
            } else {
                Response.Write(GetRecordingPlayList(remoteControl, config, transcoderId, recordingId));
            }
            Response.End();
        }
        private void SetupRecordingTable(MediaStream remoteControl, Configuration config)
        {
            // header
            TableHeaderRow hrow = new TableHeaderRow();
            TableHeaderCell dcell = new TableHeaderCell();
            dcell.Text = "Date";
            hrow.Cells.Add(dcell);
            TableHeaderCell tcell = new TableHeaderCell();
            tcell.Text = "Title";
            hrow.Cells.Add(tcell);
            foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                TableHeaderCell ccell = new TableHeaderCell();
                ccell.Text = transcoder.Name.Replace(",", ",<br />");
                hrow.Cells.Add(ccell);
            }
            RecordingTable.Rows.Add(hrow);

            foreach (Recording rec in remoteControl.GetRecordings()) {
                // base cells
                TableRow row = new TableRow();
                TableCell date = new TableCell();
                date.Text = rec.StartTime.ToShortDateString() + " " + rec.StartTime.ToShortTimeString();
                row.Cells.Add(date);
                TableCell title = new TableCell();
                title.Text = rec.Title;
                row.Cells.Add(title);

                // all transcoders
                foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                    TableCell item = new TableCell();
                    item.Text = createCellContents(remoteControl.GetTranscodedRecordingStreamUrl(rec.Id, config.Username, config.Password, transcoder.Id), "recording", rec.Id.ToString(), transcoder);
                    row.Cells.Add(item);
                }
                RecordingTable.Rows.Add(row);
            }
        }
        private void SetupStreamTable(MediaStream remoteControl, Configuration config)
        {
            // header row
            TableHeaderRow hrow = new TableHeaderRow();
            TableHeaderCell cell = new TableHeaderCell();
            cell.Text = "Channel";
            hrow.Cells.Add(cell);
            foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                TableHeaderCell tcell = new TableHeaderCell();
                tcell.Text = transcoder.Name.Replace(",", ",<br />");
                hrow.Cells.Add(tcell);
            }
            StreamTable.Rows.Add(hrow);

            // link to the playlist
            TableRow prow = new TableRow();
            prow.Cells.Add(new TableCell());
            foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                TableCell pcell = new TableCell();
                HyperLink link = new HyperLink();
                link.NavigateUrl = "Playlist.aspx?transcoder=" + transcoder.Id.ToString();
                link.Text = "Playlist";
                pcell.Controls.Add(link);
                prow.Cells.Add(pcell);
            }
            StreamTable.Rows.Add(prow);

            foreach (Channel channel in remoteControl.GetChannels()) {
                // channel name header cell
                TableRow row = new TableRow();
                TableCell title = new TableCell();
                title.Text = channel.DisplayName;
                row.Cells.Add(title);

                // all transcoders
                foreach (Transcoder transcoder in remoteControl.GetTranscoders()) {
                    TableCell item = new TableCell();
                    item.Text = createCellContents(remoteControl.GetTranscodedTvStreamUrl(channel.IdChannel, config.Username, config.Password, transcoder.Id), "channel", channel.IdChannel.ToString(), transcoder);
                    row.Cells.Add(item);
                }
                StreamTable.Rows.Add(row);
            }
        }