Seiten
Zuletzt im Ohr
Zuletzt im Sinn
Archiv
- März 2010 (5)
- Februar 2010 (3)
- Dezember 2009 (2)
- November 2009 (3)
- Oktober 2009 (17)
- September 2009 (7)
- August 2009 (7)
- Juli 2009 (3)
- Juni 2009 (2)
- Mai 2009 (4)
- April 2009 (1)
- März 2009 (3)
- Februar 2009 (11)
- Januar 2009 (14)
- Dezember 2008 (6)
- November 2008 (9)
- Oktober 2008 (6)
- September 2008 (9)
Tagcloud
Partner/Links
- gb-pix.de - Gästebuchbilder, Jappy, MySpace…
- Gratis SMS - Kostenlos ohne Anmeldung SMS verschicken
- icq-tools - Viele Tools für ICQ!
- Kostenlose Browsergames - Kostenlose Browsergames
- Servervoice Blog - Servervoice Blog
- Wordpress Theme
Network
MySpace Musik herunterladen – Part2: C# Implementation
Umsetzung der MySpace Download Workarounds
Achtung diese Lösung ist momentan nicht mehr funktionsfähig! Mehr Infos gibt es hier.
Wie versprochen folgt der Zweite Teil der “How to download songs from MySpace” – Serie.
Im ersten Teil habe ich euch gezeigt, wie man “von Hand” an die Download Url eines beliebigen Songs von einem MySpace Profil kommt.
Heute zeige ich euch wie man das ganze in C# Umsetzen könnte.
In den Kommentaren steht immer mal wieder “Schritt 1″, “Schritt2″, etc.. – diese Angaben beziehen sich auf die 5 Schritte des ersten Tutorials.
Wer dieses noch nicht gelesen hat, oder sich nicht mehr erinnern kann, darf an dieser Stelle gerne noch einmal nachlesen.
Bevor wir mit dem Sourcecode anfangen basteln wir uns noch schnell ein GUI.
Ich habe mich für folgendes Layout entschieden.
Wir benötigen im Wesentlichen für unser Beispiel also eine textBox, in der wir später den Link zum MySpace Profil angeben können, einen Button, der die Suche startet, ein ListView zum anzeigen der Songs und ein Panel mit einem Label und einer Progressbar, welches wir ein und ausblenden können um Statusmeldungen zu geben.
Doch nun zum Code…
Zuerst stellen wir in der Hauptklasse unsere Programms folgende Variablen bereit.
[sourcecode language='csharp']public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string html;
string profid;
string artid;
string plid;
string songid;
string songname;
string dlurl;[/sourcecode]
Und binden folgende Namespaces ein.
[sourcecode language='csharp']using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using System.Web;[/sourcecode]
Nun weisen wir unserem Button (SearchSongs ist der Name des Buttons) einen ClickEventhandler zu.
[sourcecode language='csharp'] private void SearchSongs_Click(object sender, EventArgs e)
{
//Wir blenden den Button aus damit die Suche
//nicht 2 mal zur gleichen Zeit gestartet werden kann
SearchSongs.Enabled = false;
//Statuspanel einblenden & konfigurieren
panelstatus.Visible = true;
labelStatus.Text = “Suche…”;
progressBar1.Style = ProgressBarStyle.Marquee;
//ListView leeren
listView1.BeginUpdate();
listView1.Items.Clear();
listView1.EndUpdate();
//Backgroundworker initalisieren, da ohne einen
//Backgroundworker das GUI beim Suchen hängen würde
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.RunWorkerAsync();
}[/sourcecode]
Als nächstes beschäftigen wir uns mit dem DoWork Eventhandler.
[sourcecode language='csharp']void bgw_DoWork(object sender, DoWorkEventArgs e)
{
//Erstellen eines Webrequest und auslesen des Quelltexts des
//MySpace Profils in den String “html”
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(textBoxUrl.Text);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
html = sr.ReadToEnd();
sr.Close();
sr.Dispose();
res.Close();
//Herraussuchen der für den nächsten Schritt benötigten
//Variablen aus dem Quelltext
Regex reg = new Regex(@”(profid=)+[0-9]+”);
profid = reg.Match(html).Value.Replace(“profid=”, “”);
reg = new Regex(@”(artid=)+[0-9]+”);
artid = reg.Match(html).Value.Replace(“artid=”, “”);
reg = new Regex(@”(plid=)+[0-9]+”);
plid = reg.Match(html).Value.Replace(“plid=”, “”);
//Wenn das angegebene MySpaceProfil gültig war, dann
//forde die nächste Seite (XML) an.
if (plid.Length > 0)
{
req = (HttpWebRequest)HttpWebRequest.Create(“http://musicservices.myspace.com/Modules/MusicServices/Services/MusicPlayerService.ashx?artistUserId=” + profid + “&action=getArtistPlaylist&artistId=” + artid + “&playlistId=” + plid);
res = (HttpWebResponse)req.GetResponse();
sr = new StreamReader(res.GetResponseStream());
html = sr.ReadToEnd();
sr.Close();
sr.Dispose();
res.Close();
}
}[/sourcecode]
Jetzt folgt logischer Weise der RunWorkerCompleted Eventhandler.
[sourcecode language='csharp'] void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Wenn das angegebene MySpaceProfil gültig war, dann
//lese das erhaltene XML Dokument aus – wenn nicht,
//dann gebe Fehlermeldung aus
if (plid.Length > 0)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
//Für jede gefundene Node im soeben erhaltenen XML Dokument
//wird die SongID und der Titel ausgelesen und daraus ein ListViewItem
//erstellt und unserem ListView zugewiesen.
foreach (XmlNode track in doc.DocumentElement.GetElementsByTagName(“track”))
{
ListViewItem lvi = new ListViewItem(HttpUtility.HtmlDecode(track.ChildNodes[0].InnerText));
lvi.Tag = HttpUtility.HtmlDecode(track.ChildNodes[1].Attributes[0].Value);
listView1.BeginUpdate();
listView1.Items.Add(lvi);
listView1.EndUpdate();
}
}
else
{
MessageBox.Show(“Ungültiges MySpace Profil! Überprüfe den Link!”);
}
//Die Suche ist somit beendet und der SearchSong Button darf
//wieder benutzt werden. Das Panel hingegen brauchen wir vorerst nicht
//mehr und blenden es deshalb aus.
SearchSongs.Enabled = true;
panelstatus.Visible = false;
}[/sourcecode]
Als nächstes müssen wir auf die Entscheidung des Users “warten”. (Welcher Song soll geladen werden? …)
Deshalb lösen wir unser nächstes Event erst beim Doppelklick auf einen der Songs aus. (Doubleclick Event der Listviews)
[sourcecode language='csharp'] private void listBoxSongs_MouseDoubleClick(object sender, MouseEventArgs e)
{
//wir überprüfen ob auch ein Song ausgewählt wurde
//Achtung! – Die “Multiselect”-Eigenschaft des ListViews auf “false” setzen
if (listView1.SelectedItems.Count > 0)
{
//Nun deaktivieren wir den Suchbutton und das Listview, damit nicht
//zwei Downloads gleichzeitig gestartet werden können
SearchSongs.Enabled = false;
listView1.Enabled = false;
//Da es wieder einen Vorgang gibt, auf den der User warten muss, blenden
//wir das Satuspanel wieder ein und geben dem Label auf dem Panel einen
//aktuellen Statustext.
panelstatus.Visible = true;
labelStatus.Text = “Initalisiere…”;
//Danach befüllen wir die Strings songid und songname mit den dem gewählten
//Song zugeordneten Eigenschaften.
songid = listView1.SelectedItems[0].Tag.ToString();
songname = listView1.SelectedItems[0].Text;
BackgroundWorker bgw2 = new BackgroundWorker();
bgw2.DoWork += new DoWorkEventHandler(bgw2_DoWork);
bgw2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw2_RunWorkerCompleted);
bgw2.RunWorkerAsync();
}
}[/sourcecode]
Nachdem wir soweit alles startklar für den Download haben geht’s in den Events des soeben erstellten Backgroundworker weiter.
[sourcecode language='csharp'] void bgw2_DoWork(object sender, DoWorkEventArgs e)
{
//Wir setzen aus den soeben zugewiesenen String die RequestURL für den Song zusammen
//und laden die angeforderte XML Seite in den String html
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(@”http://musicservices.myspace.com/Modules/” +
“MusicServices/Services/MusicPlayerService.ashx?songId=” + songid + “&action=getSong”);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
html = sr.ReadToEnd();
sr.Close();
sr.Dispose();
res.Close();
//Nun öffnen wir das XML Dokument, lesen die link-Node aus und
//legen ihren Inhalt in dem String dlurl ab
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
dlurl = doc.DocumentElement.GetElementsByTagName(“link”)[0].InnerText;
}[/sourcecode]
Nachdem das DoWork Event nun abgearbeitet ist, befassen wir uns mit dem RunWorkerCompleted Event.
[sourcecode language='csharp'] void bgw2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Wir intanzieren einen SaveFileDialog und weisen ihm die nötigsten
//Eigenschaften, wie z.B. das Dateiformat zu
SaveFileDialog sfd = new SaveFileDialog();
sfd.DefaultExt = “mp3″;
sfd.FileName = songname;
sfd.Title = “Song speichern”;
sfd.AutoUpgradeEnabled = true;
sfd.Filter = “Mp3 Datei (*.mp3)|*.mp3″;
sfd.AddExtension = true;
//Wenn der Dialog mit OK bestätigt wurde fahren wir mit dem Download fort
//ansonsten blenden wir das Statuspanel wieder aus und aktivieren die anderen’
//Steuerelemente wieder
if (sfd.ShowDialog() == DialogResult.OK)
{
songname = sfd.FileName;
//Wir erstellen einen neuen Webclient, weisen einen FileCompleted und einen Eventhandler
//für den Downloadfortschritt zu und starten den Download
WebClient wc = new WebClient();
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
//Nun setzen wir noch die Progressbar Value auf 0 und ändern den ProgressbarStyle auf
//continuous um später den Fortschritt des Downloads genau angeben zu können.
progressBar1.Value = 0;
progressBar1.Maximum = 100;
progressBar1.Style = ProgressBarStyle.Continuous;
wc.DownloadFileAsync(new Uri(dlurl), songname);
}
else
{
SearchSongs.Enabled = true;
listView1.Enabled = true;
panelstatus.Visible = false;
labelStatus.Text = “Suche…”;
}
}[/sourcecode]
Nachdem der Download gestartet ist greift in regelmäßigen Abständen das DownloadProgressChanged Event. Mit Hilfe von diesem Event können wir den Fortschritt des Downloads auslesen und auf unserem Statuspanel anzeigen lassen.
[sourcecode language='csharp']void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//Wir weisen der Progressbar den Downloadfortschritt in Prozent zu.
progressBar1.Value = e.ProgressPercentage;
//Dem Label geben wir die Anzahl der geladenen KB, sowie der Gesamt KB an.
labelStatus.Text = (e.BytesReceived / 1024).ToString() + ” KB / ” + (e.TotalBytesToReceive / 1024).ToString() + “KB”;
}[/sourcecode]
Das letzte zu behandelnde Event ist das DownloadFileComleted Event. Nach Ablauf dieses Events ist der Download fertig und der User kann den nächsten Song herunterladen bzw. ein neues Profil durchsuchen.
[sourcecode language='csharp'] void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
//Ist der Download fertig, blenden wir das Statuspanel wieder aus
//und reaktivieren die anderen Steuerelemente wieder.
SearchSongs.Enabled = true;
listView1.Enabled = true;
panelstatus.Visible = false;
labelStatus.Text = “Suche…”;
}[/sourcecode]
Das war’s auch schon! Ich hoffe ich konnte euch ein wenig helfen und ihr konntet mir folgen!
Wer mag kann den ersten Teil der Serie hier noch mal nachlesen.
Das Programm gibt es später in einem anderen Post zum Download. Den Link werde ich dann hier an dieser Stelle aber auch noch ein mal nachreichen.
Das ganze gibt’s nun auch als ausführbare Datei und auf Wunsch auch als Visual Studio 2008 Projekt. Wenn du Interesse hast, dann geht’s hier lang!
Liebe Grüße,
Raffi
Ähnliche Artikel:
Hallo!

Kategorien
- Der tägliche Senf… (77)
- Informatik (81)
- C# & .net Framework (15)
- Cheat Sheets (4)
- HTML, PHP, etc. (5)
- Neuigkeiten (27)
- Software-Projekte (34)
- Tipps & Tricks (29)
- Musik (4)
- Downloads (3)
- Hörbar – Raffis Musiktipp (4)
- Videoclips (4)
- Schule (11)
Kalendar
| M | D | M | D | F | S | S |
|---|---|---|---|---|---|---|
| « Apr | Jun » | |||||
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Counter
| Besucherstatistik | |
| Besucher gesamt: | 113.294 |
| Besucher heute: | 129 |
| Besucher gestern: | 320 |
| Max. Besucher pro Tag: | 629 |
| gerade online: | 1 |
| max. online: | 89 |
| Seitenaufrufe gesamt: | 285.515 |
| Seitenaufrufe diese Seite: | 1.567 |
| Counterstart: | 13.10.2008 |
Meta
Am meisten kommentiert
Neue Artikel
- Update: Webmusix 1.3.6
- C# – Webbrowser Control: Popups blocken
- Generierung von FullFeeds = Contentklau?
- Cebit 2010 – ein kurzer Rückblick
- Umzug abgeschlossen – neuer Webspace, neues Glück?
- Hörbar – Raffis Musiktipp #4
- Da tut sich was…
- Update: Webmusix 1.3.5
- MultiVZ Tools – der Untergang Teil 2
- MultiVZ Tools tot? Abuse von VZnet bekommen…
Neue Kommentare
- CONeal: Hey Raffi, erstmal vielen Dank für das Tutorial. Es hat mich auf jeden Fall schon mal weiter gebracht. Ich...
- Micha: Na dann wünsche ich euch mal viel Erfolg! Es grüßt, der Micha!
- Raffi: Youtube Pipes ist doch aber nur für Mashups?! (Zumindest sehe ich keine Möglichkeit Fullfeeds aus ShortFeeds...
- caschy: Aber ja, mach et und mail mich an, wenn es soweit ist
- caschy: Yahoo Pipes?
net-blog.net © 2008-2010




2 Benutzer kommentierten "MySpace Musik herunterladen – Part2: C# Implementation"
25 Mai 2009 um 20:45:16
[...] – natürlich samt SourceCode!) Das ganze gibt’s mittlerweile auch als C# Umsetzung hier im [...]
28 Mai 2009 um 23:48:38
[...] mit dem Grundsatz des Downloads von Liedern welche sich auf MySpace befinden auseinandergesetzt. Im zweiten Teil haben wir diese Schritte als C# Code umgesetzt und im dritten und letzten “Teil” gibt es nun [...]