Получение метаданных с онлайн-трансляций радиостанций Shoutast - PullRequest
0 голосов
/ 31 октября 2019

Я создаю простое приложение, которое воспроизводит онлайн-радио, например, австрийский Kronehit, Arabella, OE3 и немного сербский. Я проверил весь переполнение стека и не смог найти ничего, что смогу использовать. У меня уже есть некоторый код, который вроде работает, но мне нужно что-то для постоянного обновления моего приложения. Я пытался с таймером, но я не нашел его работы. Вот текущий код:

public async Task<string> GetMetaDataFromIceCastStream(string url)
    {
        HttpClient m_httpClient = new HttpClient();
        m_httpClient.DefaultRequestHeaders.Add("Icy-MetaData", "1");
        var response = await m_httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
        m_httpClient.DefaultRequestHeaders.Remove("Icy-MetaData");
        if (response.IsSuccessStatusCode)
        {
            IEnumerable<string> headerValues;
            if (response.Headers.TryGetValues("icy-metaint", out headerValues))
            {
                string metaIntString = headerValues.First();
                if (!string.IsNullOrEmpty(metaIntString))
                {
                    int metadataInterval = int.Parse(metaIntString);
                    byte[] buffer = new byte[metadataInterval];
                    using (var stream = await response.Content.ReadAsStreamAsync())
                    {
                        int numBytesRead = 0;
                        int numBytesToRead = metadataInterval;
                        do
                        {
                            int n = stream.Read(buffer, numBytesRead, 10);
                            numBytesRead += n;
                            numBytesToRead -= n;
                        } while (numBytesToRead > 0);

                        int lengthOfMetaData = stream.ReadByte();
                        int metaBytesToRead = lengthOfMetaData * 16;
                        byte[] metadataBytes = new byte[metaBytesToRead];
                        var bytesRead = await stream.ReadAsync(metadataBytes, 0, metaBytesToRead);
                        var metaDataString = System.Text.Encoding.UTF8.GetString(metadataBytes);
                        return metaDataString;
                    }
                }
            }
        }

        return null;
    }

Если честно, я действительно не знаю, что он делает, я скопировал его откуда-то: D

Вот код, где я использую эту функцию:

private async void bunifuFlatButton1_Click(object sender, EventArgs e)
    {
        label3.Text = "";
        Radio radio = new Radio();
        axWindowsMediaPlayer1.URL = "http://onair.krone.at/kronehit-hd.mp3";
        string url = "http://onair.krone.at/kronehit-hd.mp3";
        radio.Text= "Radio Player - Radio KRONEHIT";
        label1.Text = "Kronehit - Mehr geile hits!";
        pictureBox.BackgroundImage = Image.FromFile("../../img/kronehit.png");
        string s = await GetMetaDataFromIceCastStream(url);
        label3.Text = s;
    }

Надеюсь, что вы мне поможете!

...