Moin moin,
ich bin grade dabei einen Youtube Downloader zu schreiben mit diversen Funktionen, die ich bei anderen vermisse, z.B Clipboardmonitoring, Autostart Download usw. Das meist ist schon drin und funktioniert auch. Ich verstehe das error handling aber noch nicht wirklich. Bin erst seit 3 Tagen mit C# angefangen und hab mir vieles in der Zeit selbst zusammengesucht und mit Youtube Videos etc gelernt.
Ich habe 3 Felder, eins für den Speicherort, eins für den Youtube Link und eins für die Auflösung (geht noch nicht, muss ich noch was ab dem "else" ändern. Nutze libvideo als library. Ich habe es jetzt so gemacht:
private async void btn_dl_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtLoc.Text))
{
MessageBox.Show("Kein Ordner angegeben");
}
if (string.IsNullOrWhiteSpace(txtUrl.Text))
{
MessageBox.Show("Kein Video angegeben");
}
if (txtUrl.Text.Contains("&list"))
{
MessageBox.Show("Playlist geht noch nicht ;)");
}
else {
var youTube = YouTube.Default;
var video = await youTube.GetVideoAsync(txtUrl.Text);
var videodl = ofd.SelectedPath + "\\" + video.FullName;
lblStatus.Text = "Lädt";
File.WriteAllBytes(videodl, await video.GetBytesAsync());
lblStatus.Text = "Fertig";
}
}
ich weiß wohl das es falsch ist, muss da glaub ich mit "and or" arbeiten, krieg aber noch hin. Wüsste nur gerne was ich da reinknallen muss damit das Programm nicht abstürzt sondern wie die MessageBox anzeigt das z.B das Feld leer ist. Stürzt halt dannach aber noch ab. Desweiteren würde ich gern wissen wie man es lösen kann, wenn SPeicherort und URL angegeben ist, der Code nach dem "else" automatisch ausgeführt wird. Eine Checkbox dafür habe ich schon verbaut, hatte auch schon einige Dinge probiert, hat alles aber irgendwie nicht geklappt. Clipboardmonitoring mit on/off checkbox hab ich hinbekommen. der fügt dann den link automatisch in die URL zeile, soll aber per option auch direkt den download starten können. Das ist aber grade noch nicht so wichtig, das kriege ich auch alleine hin. Wichtig ist grade für mich das mit den errors wenn die URL, Path zeilen leer sind 😃
Wäre über jede hilfe dankbar, ich brauch auch nicht unbedingt direkt den fertigen code, sondern ne hilfestellung wäre auch schon ganz gut 😃
Danke im vorraus,
MfG
Soweit mir bekannt ist, ist es nicht erlaubt Videos von Youtube zu laden.
Bitte korigiert mich, aber ist Google nicht selbst dabei gegen die ganzen Portale vorzugehen, die Videos von Youtube laden und auch gegen Portale, die nur die Audio Spur laden?
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Keine Ahnung, gibt ja überall Youtube Downloader als Freeware, zu kaufen, in Appstores, als Userscript. Glaub so eng sehen die das nicht, sonst wären die nicht im google playstore xD.
Edit: Obwohl wenn ich mal so drüber nachdenke, es umgeht ja die Werbung. Denke schon das es nicht erlaubt ist. Hoffentlich habe ich jetzt keinen Fehler gemacht zu schreiben das ich einen Youtube Downloader schreibe xD Krieg bestimmt so keine Hilfe mehr
Hallo anideath,
hat alles aber irgendwie nicht geklappt.
Was genau versuchst du zu tun? Kannst du deine Frage mal auf einen Satz zusammenfassen? Du kannst mit dem Debugger [Artikel] Debugger: Wie verwende ich den von Visual Studio? doch schauen, was null ist, was du auf empty überprüfen musst.
Edit: Wenn ichs mehrmals lese: Möchtest du vielleicht sagen "Wie fange ich einen leeren Text ab, gebe eine Fehlermeldung aus und lasse das Programm trotzdem weiterlaufen?"
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Mich wundert IsNullOrWhitespace auch. Text in einer Textbox ist doch nie null und auf Whitespace prüfen bringt auch gar nichts denn es gibt noch Millionen andere Eingaben die genauso unsinnig sind wie Whitespace. Prüfe mit Directory.Exists ob etwas ein gültiger Ordner ist.
Ich würde nach einer Prüfung mit return aus der Methode rausgehen.
stimmt ich bin da wahrscheinlich falsch an der Sache rangegangen. In der ersten Zeile hätte ich gerne überprüft, ob es ein gültiger Ordner ist, in der 2. Zeile, ob es ein gültiger Youtube Link ist. Für Youtube Link müsstest eigentlich eine Variable geben in der libvideo library, das kann ich schnell rausfinden. Wenn halt alle Dinge zutreffen, würde ich gerne das der Download dann startet. Ich werde es morgen abend mal mit chiliics Methode probieren und in der URL Zeile mal schauen ob ich eine Prüfung für Youtube Link hinbekomme. Notfalls mit regex oder so xD Der 3. Prüft bei mir derzeit, ob der Link eine Playlist ist. Playlists saugen funktioniert noch nicht, dafür brauche ich noch eine andere library.
Den Link von
Coffeebean schaue ich mir auch morgen an, hab ihn eben überflogen. Glaub der hilft mir auch schon enorm weiter. Wissen das ich noch nicht hatte.
Danke schonmal für die Hilfe. Ich werde mal morgen ein wenig basteln und nochmal bescheid geben 😃 Von mir aus können die ganzen Prüfungen auch raus, as die App eh nur für mich ist, wollte es nur zum lernen mal richtig machen 😃
Schöne Nacht noch euch allen
Edit: mehrfach Rechtschreibfehler ausgebessert da ich so schnell tippe und oft Buchstaben oder Worte vergesse xD
Edit: 03.08.17
Habs jetzt einigermaßen hinbekommen, wahrscheinlich immernoch nicht der beste Weg aber für mich reicht es erstmal. Irgendwann kriege ich das noch perfekt hin 😃. Ich finde noch keine Möglichkeit eine Progressbar einzufügen und wenn ich auf Download klicke. Weiß jemand wie man das in diesem Fall machen kann ? Hab mir einiges durchgelesen aber ich check das noch nicht so richtig. Hier ist der gesamte Code:
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using MaterialSkin;
using MaterialSkin.Controls;
using YoutubeExplode;
using YoutubeExplode.Models;
using Tyrrrz.Extensions;
namespace Ultra_Simple_Youtube_Downloader_2
{
public partial class form1 : MaterialForm
{
[DllImport("User32.dll")]
protected static extern int
SetClipboardViewer(int hWndNewViewer);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool
ChangeClipboardChain(IntPtr hWndRemove,
IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg,
IntPtr wParam,
IntPtr lParam);
IntPtr nextClipboardViewer;
public form1()
{
InitializeComponent();
var materialSkinManager = MaterialSkinManager.Instance;
materialSkinManager.AddFormToManage(this);
materialSkinManager.Theme = MaterialSkinManager.Themes.DARK;
materialSkinManager.ColorScheme = new ColorScheme(Primary.Red500, Primary.Red700, Primary.Red100, Accent.Red200, TextShade.WHITE);
nextClipboardViewer = (IntPtr)SetClipboardViewer((int)
this.Handle);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new form1());
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
DisplayClipboardData();
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
void DisplayClipboardData()
{
IDataObject iData = new DataObject();
iData = Clipboard.GetDataObject();
if (cbAutoPaste.Checked)
{
if (iData.GetDataPresent(DataFormats.Text))
{
tUrl.Text = (string)iData.GetData(DataFormats.Text);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
string appdata = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos);
tPath.Text = appdata;
}
private static string NormalizeId(string input)
{
if (!YoutubeClient.TryParseVideoId(input, out string id))
id = input;
return id;
}
private static string NormalizeFileSize(long fileSize)
{
string[] units = { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
double size = fileSize;
int unit = 0;
while (size >= 1024)
{
size /= 1024;
++unit;
}
return $"{size:0.#} {units[unit]}";
}
private async void materialRaisedButton1_Click(object sender, EventArgs e)
{
var client = new YoutubeClient();
string id = tUrl.Text;
id = NormalizeId(id);
try
{
var videoInfo = await client.GetVideoInfoAsync(id);
var streamInfo = videoInfo.MixedStreams.OrderBy(s => s.VideoQuality).Last();
string fileExtension = streamInfo.Container.GetFileExtension();
string fileName = $"{ videoInfo.Title}.{ fileExtension}";
string EndDirectory = tPath.Text + @"\";
using (var input = await client.GetMediaStreamAsync(streamInfo))
using (var output = File.Create(EndDirectory + fileName))
{
await input.CopyToAsync(output);
}
}
catch (Exception)
{
}
}
private async void tUrl_TextChanged(Object sender, EventArgs e)
{
if (cbAutoDownload.Checked)
{
var client = new YoutubeClient();
string id = tUrl.Text;
id = NormalizeId(id);
try
{
var videoInfo = await client.GetVideoInfoAsync(id);
var streamInfo = videoInfo.MixedStreams.OrderBy(s => s.VideoQuality).Last();
string fileExtension = streamInfo.Container.GetFileExtension();
string fileName = $"{ videoInfo.Title}.{ fileExtension}";
string EndDirectory = tPath.Text + @"\";
using (var input = await client.GetMediaStreamAsync(streamInfo))
using (var output = File.Create(EndDirectory + fileName))
{
await input.CopyToAsync(output);
}
}
catch (Exception)
{
}
}
}
private async void materialFlatButton1_Click_1(object sender, EventArgs e)
{
var client = new YoutubeClient();
string id = tUrl.Text;
Console.WriteLine(tUrl.Text);
id = NormalizeId(id);
try
{
var videoInfo = await client.GetVideoInfoAsync(id);
var streamInfo = videoInfo.MixedStreams.OrderBy(s => s.VideoQuality).Last();
string fileExtension = streamInfo.Container.GetFileExtension();
string fileName = $"{ videoInfo.Title}.{ fileExtension}";
string EndDirectory = tPath.Text + @"\";
using (var input = await client.GetMediaStreamAsync(streamInfo))
using (var output = File.Create(EndDirectory + fileName))
{
await input.CopyToAsync(output);
}
}
catch (Exception)
{
}
}
private void materialFlatButton2_Click(object sender, EventArgs e)
{
if (ofd.ShowDialog() == DialogResult.OK)
{
tPath.Text = ofd.SelectedPath;
}
}
private void tUrl_Click(object sender, EventArgs e)
{
}
}
}