protected override async Task <Broadcast> GetBroadcast(string title) { if (title == null) { return(null); } string caption, description; if ((title == "LIVE" || title == "Radio SWH LIVE") && listedGuide != null) { caption = listedGuide.CurrentBroadcast.Caption; description = null; } else { if (title[title.Length - 1] == '&') { // Gadījumos, kad nosaukumā jābūt apostrofam, tas tiek aizvietots ar ampersandu un pārējās daļas nav. // Tādēļ izgūst pilnos dziesmas datus no XML. /* * <PLAYBACKSTATE> * <lastBuildDate>2012-03-29 21:35:45</lastBuildDate> * <PLAY INDEX="0"> * <ARTIST>BEATLES</ARTIST> * <TITLE>A HARD DAY'S NIGHT</TITLE> * <start_time>02:21</start_time> * </PLAY> * </PLAYBACKSTATE> * <PLAYBACKSTATE> * <lastBuildDate>2012-03-30 22:50:48</lastBuildDate> * <PLAY INDEX="0"> * <ARTIST>SWHPLUS</ARTIST> * <TITLE>LIVE</TITLE> * <start_time>14:48</start_time> * </PLAY> * </PLAYBACKSTATE> */ // Vēl ir JSON formātā un ar lielāku informāciju (SWH gadījumā): sobrid_etera_title, bildes sobrid_etera, imgfull, img300 un img135. using (var client = new ProperWebClient(System.Text.Encoding.ASCII)) { Match match = new Regex("<ARTIST>(?'artist'[^<]+)<\\/ARTIST>\\s+<TITLE>(?'title'[^<]+)<", RegexOptions.Multiline).Match(await client.DownloadStringTaskAsync(nowUrl)); caption = match.Groups["title"].Value.ToCapitalized(); description = match.Groups["artist"].Value.ToCapitalized(); } } else { caption = (capitalize ? title.ToCapitalized():title).SplitCaption(out description); } if (listedGuide != null) { description += Environment.NewLine + listedGuide.CurrentBroadcast.Caption; } } return(new Broadcast(DateTime.Now, DateTime.Now.AddHours(1), caption, description)); }
public override void HandleCommand(int itemIndex) { // Atskaņotājs atrodas lapā http://echo.msk.ru/set/, kura ielāde sekojošo adresi. Flash versijā ar RTMP protokolu ir pieejamas vairākas plūsmas, bet M3U8 variantā tās visas saliktas vienā kadrā (dažreiz kadrs var attēlot arī vienu plūsmu). string sessionId; // Adresē mainās sesijas identifikators, tāpēc to katru reizi jāpārlādē. // Lai gan no lappuses var ņemt pilnu adresi, kopš reizes tā ir mainījusies Flash klientam, neatbilst patiesībai M3U8 versijai, tāpēc pagrābj tikai sesijas numuru. using (var client = new ProperWebClient()) sessionId = Regex.Match(client.DownloadString("http://echomsk.onlinetv.ru/widget/live/echomsk.html"), @"\.m3u8\?s=[a-z0-9]+").Value; StudioWindow.Open(Items[0], "http://prague1.setevisor.tv:1935/echomsk/_definst_/echomsk.stream/playlist" + sessionId, 640, 480, @"playlist\.m3u8\?[^\n]+"); // Aiz jautājumzīmes wowzasessionid un tā pati drošības sesija. }
private async void Window_Loaded(object sender, EventArgs e) { // [{"id":"988747","artist":"Phoenix","title":"Armistice (Live at Hordern Pavilion, Sydney, 2010)","runtime":"197.037","airtime":"2013-12-24 14:09:35","status":"playing","song_id":"929","artist_id":"299","station_id":"1","images":{"ios":"http:\/\/cdn.pieci.lv\/images\/phoenix-ios.jpg","metadata":{"ios":null,"android":null,"desktop":null},"android":"http:\/\/cdn.pieci.lv\/images\/phoenix-android.jpg","desktop":"http:\/\/cdn.pieci.lv\/images\/phoenix-desktop.jpg"}}, ... ] // Novērots, ka sarakstā dziesmas atkārtojas ar vienādu laiku, bet dažadiem ID. using (var client=new ProperWebClient()) { list.ItemsSource= from song in (await client.GetJson(url)).Elements("item") let title=song.Element("title").Value let splitIdx=title.IndexOf('(') select new PlaylistItem { StartTime=TimeZoneInfo.ConvertTime(DateTime.ParseExact(song.Element("airtime").Value, PieciGuide.TimeFormat, CultureInfo.InvariantCulture), timezone, TimeZoneInfo.Local), Duration=TimeSpan.FromSeconds(double.Parse(song.Element("runtime").Value, CultureInfo.InvariantCulture)), Artist=song.Element("artist").Value, Caption=splitIdx < 1 ? title:title.Substring(0, splitIdx-1), // -1 tukšumam pirms iekavas. <1, jo var būt nosaukums, kurš viss iekavās Description=splitIdx < 1 ? null:title.Substring(splitIdx+1, title.Length-splitIdx-2) // -2 iekavām }; } }
public override Channel GetChannel(uint id) { if (brand == null) { brand = new Brand(Colors.White, 0x606060.ToColor(), Colors.White, 0x6C54D5.ToColor(), 0x6C54D5.ToColor(), 0x483998.ToColor(), Colors.Black, Colors.Black); } if (id == 0 && Channels.ContainsKey(0)) // Nav izvēlēts neviens kanāls. { return(new EmptyChannel("101.ru", GetResourceImage("101ru.png"), brand, new ChannelMenu())); } var channel = channels.FirstOrDefault(c => c.Id == id); if (channel == null) { throw new ChannelNotFoundException(id); } BitmapSource logo = GetCachedImage(id.ToString()); if (logo == null) { using (var client = new ProperWebClient()) { using (Stream imageStreamSource = client.OpenRead(channel.LogoUrl)) using (var srcBitmap = new D.Bitmap(imageStreamSource)) // Drawing.Bitmap, lai WPF neizstieptu attēlu, pārrēķinot DPI. // Ielādē caurspīdīguma masku, kura izveidota, apgriežot krāsas oriģinālajā cover_000_round.png. using (D.Bitmap bitmap = (D.Bitmap)D.Bitmap.FromStream(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(this.GetType(), "LogoMask.png"))) { var rect = new D.Rectangle(new D.Point(0, 0), bitmap.Size); var inBits = srcBitmap.LockBits(rect, DI.ImageLockMode.ReadOnly, DI.PixelFormat.Format32bppArgb); var outBits = bitmap.LockBits(rect, DI.ImageLockMode.WriteOnly, DI.PixelFormat.Format32bppArgb); unsafe { // Nedrošais kods ar norādēm labākai veiktspējai. // Izkrāso caurspīdīguma masku ar logotipa krāsām. for (int y = 0; y < bitmap.Height; y++) { byte *inRow = (byte *)inBits.Scan0 + inBits.Stride * y; byte *outRow = (byte *)outBits.Scan0 + outBits.Stride * y; for (int x = 0; x < bitmap.Width; x++) { outRow[4 * x] = inRow[4 * x]; // zilā outRow[4 * x + 1] = inRow[4 * x + 1]; // zaļā outRow[4 * x + 2] = inRow[4 * x + 2]; // sarkanā } } } srcBitmap.UnlockBits(inBits); bitmap.UnlockBits(outBits); logo = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } CacheImage(id.ToString(), logo); // {"status":0,"result":{"token":"09270779","playlist":[{"url":"http:\/\/ru2.101.ru:8000\/c14_24?tok=09270779"}]},"errorCode":0,"errorMsg":""} string urlPrefix = "http://" + Settings.Default.Region; // Iznests mainīgajā, lai nepārrēķinātu katru reizi, meklējot atskaņošanas adresi. channel.StreamUrl = client.GetJsonSync("http://101.ru/api/getstationstream.php?station_id=" + id). Element("result").Element("playlist").Elements("item").First(i => i.Element("url").Value.StartsWith(urlPrefix)).Element("url").Value; } } return(new IcyChannel(channel.StreamUrl, logo, timezone, true, brand, new ChannelMenu()) { UserAgent = "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:18.0) Gecko/20130119 Firefox/18.0" }); // Lai 101.ru neteiktu, ka jāklausās pārlūkā. }