Pobieracz - program do pobierania mp3 i mp4

0

Witam,
przedstawiam program automatyzujący proces pobierania muzyki z wrzuty i klipów w formacie mp4 z youtube. Program pisany w celach edukacyjnych, więc nie ma co się wiele spodziewać fajerwerków, ale ocena i konstruktywna krytyka mile widziane.

http://www.przeklej.pl/plik/pobieracz-v1-0-rar-002bf0anl03p

Uwaga: layout programu może powodować raka i choroby serca.

0

W sumie to całkiem nieźle zrobione, nie ma 'niewiadomoczego', ale spełnia swoją podstawową funkcję jak najbardziej.

0

No to moje uwagi, bo kiedyś również napisałem i później poprawiałem po zmianach w serwisie program do pobierania z wrzuta.pl plików mp3 lub filmów po wklejeniu konkretnego linka. Na plus: podgląd plików, ale jego nie testowałem, bo jak niżej wyjaśaniam minusy: Minusy: program bardzo wolno wyszukuje, a czasami nawet nic nie pokazuje tylko w kółko jest Trwa, nawet jak z pod Opery działanie strony wrzuta.pl jest natychmiastowe. Poza tym wolne pobieranie pliku, tak mi sie wydaje, mój downloader daną mp3ke pobiera również wolno, bo tak wolno działa wrzuta, ale robi to i tak o wiele szybciej. Brakuje możliwości anulowania wyszukiwania. Można zmieniac wpis w trakcie szukania, a według mnie wtedy pole edycyjne powinno mieć ReadOnly na True i wyszarzone tło w kolorze (przynajmniej tak jest pod Delphi) clInactiveBorder. Przydało by się domyslne zaznaczenie radiobuttona z wyborem MP3 lub zapamiętanie tego w pliku ini przykładowo w podkatalogu %AppData%. Dodam jeszcze, że wyszukiwarka zadziałała mi dla frazy "Captain Hollywood" tylko raz, później już szukała i szukała i nic. Do tego plik wykonywalny spakował bym na przykład UPX'em. Zawsze ciut mniej to zajmie. Wiem łącza mamy teraz szybkie, ale powinno sie dążyć do tego żeby program była jak najmniejszy i jak najzgrabniejszy. A i ponumerowałeś wersje 1.0, też tak kiedyś robiłem. W sumie przy amatorskim kodowaniu to szczegół, ale lepiej zaczynać numerowanie od bardzo niskich numerów typu 0.1 albo nawet 0.0.1, a wersja 1.0 powinna być mocno rozwinięta i pozbawiona wszelkich błędów. Sam swój program pod linkiem z mojej sygnaturki zacząłem numerować od 0.1, a teraz jest wersja 0.99, bo w międzyczasie poprawiałem rożne błedy, a i FaceBook zmieniał zawartość pobieranego kodu html i program również musiał być zmieniony, aby nadal działał, jak należy. A co do Twojego tworu to więcej uwag nie mam. Może ktoś jeszcze coś znajdzie i napisze. Ka osobiście wolę użyć swojego Wrzuta Downloader (który też numewrowałem tak szumnie od 1.0 ;)) aby mieć ustawioną nazwę pliku z podanego linku. Ewentualnie jak coś szybko pobrać z wrzuta.pl to przydaje się userjs dla Opery napisany i poprawiony dla obsługi serwisu po zmianach - przez Zajca z forum supportu Opery. Jedno kliknięcie na stronie z plikiem i zapis.

0
olesio napisał(a)

program bardzo wolno wyszukuje, a czasami nawet nic nie pokazuje tylko w kółko jest Trwa, nawet jak z pod Opery działanie strony wrzuta.pl jest natychmiastowe

Wolno czyli ile czasu? Sprawdzałem na 2 kompach, na obu wyszukiwanie trwa 1-2sek, więc stosunkowo szybko.

olesio napisał(a)

Poza tym wolne pobieranie pliku, tak mi sie wydaje, mój downloader daną mp3ke pobiera również wolno, bo tak wolno działa wrzuta, ale robi to i tak o wiele szybciej

Z tym planuje coś zrobić(prawdopodobnie użyje jakiejś gotowej biblioteki np. cURL) w najbliższym czasie, bo rzeczywiście demonem szybkości mój program nie jest.

olesio napisał(a)

Brakuje możliwości anulowania wyszukiwania. Można zmieniac wpis w trakcie szukania, a według mnie wtedy pole edycyjne powinno mieć ReadOnly na True i wyszarzone tło w kolorze (przynajmniej tak jest pod Delphi)

Myślałem że anulowanie wyszukiwanie nie jest potrzebne, skoro wyszukiwało się szybko, praktycznie natychmiastowo(przynajmniej u mnie).

olesio napisał(a)

Dodam jeszcze, że wyszukiwarka zadziałała mi dla frazy "Captain Hollywood" tylko raz, później już szukała i szukała i nic. Do tego plik wykonywalny spakował bym na przykład UPX'em. Zawsze ciut mniej to zajmie. Wiem łącza mamy teraz szybkie, ale powinno sie dążyć do tego żeby program była jak najmniejszy i jak najzgrabniejszy

Też przed chwilą zauważyłem ten bug z wyszukiwaniem niektórych fraz, ale póki co nie mam pojecia co jest jego przyczyną...
.

0

Przyczyna błędu leży zawsze tam, gdzie się jej nie spodziewasz :D
To jest jakiś fenomen, w moim projekcie to samo miałem był błąd ewidentnie myślałem "tutaj coś musi być nie tak" i tak szedłem szlaczkiem i idę idę i doszedłem do zupełnie innego miejsca gdzie był faktyczny błąd :P
Tak pół żartem, pół serio.

0

Witam ponownie, troche zmodyfikowałem moją aplikację i poprawiłem część błędów(te które znalazłem), zmieniłem tez wygląd i jest teraz trochę mniej odstraszający.
user image

Link: http://www.przeklej.pl/plik/pobieracz-v1-2-rar-002bp81cibq4

0

Odświeżam temat. Wprowadzone drobne zmiany, dodana możliwość pobierania mp3 z youtube, kolejka pobierania, poprawione wyświetlanie poglądu z youtuba.

Wersja instalacyjna: http://www.przeklej.pl/plik/pobieracz-setup-rar-0044jm68o1qi3sp
Wersja bez instalacji: http://www.przeklej.pl/plik/pobieracz-rar-0044jm7ap1qi3sp

user image
user image

Zdaje sobie sprawę że zbyt wiele do oceniania tu nie ma, ale kod wrzucę dopiero gdy go trochę uporządkuje.

3

Jeśli chodzi o program:

  1. Nie można zmienić rozmiaru okna, ale można je zmaksymalizować.
  2. Lista wyszukanych piosenek jest tak wąska, że nie widać tytułów.
  3. Na liście mogłoby być menu kontekstowe z pozycjami "podgląd", "dodaj do kolejki", itd.
  4. Podgląd uruchamiałbym w nowym oknie, a nie na zakładce.
  5. Albo w ogóle nie robiłbym żadnych zakładek, tylko większą formę, u góry po lewej lista wyszukanych utworów, po prawej podgląd aktualnie zaznaczonego pliku, pod spodem kolejka pobierania.
  6. W oknie wyboru jakości oprócz tych, które filmik udostępnia i które można zaznaczyć, są też nieklikalne. Moim zdaniem powinno ich nie być.
  7. Przycisk "dodaj do kolejki" nie powinien działać przy pustej liście.
  8. Gdy wybieram opcję "MP3", to ściąga mi się plik w formacie aac.
  9. Gdy wybiorę którąś z opcji wideo i opcję MP3, to ściąga mi się tylko plik dźwiękowy.
  10. Po pobraniu pliku audio, i po udzieleniu zgody na rozpoczęcie nowego pobierania, kolejka nie jest czyszczona.
  11. Niektóre pliki wideo po pobraniu nie działa, MPC wyświetla komunikat: "Unsupported DocType: webm".
  12. Po dodaniu pliku do kolejki nie można już go z niej usunąć.
  13. Próba pobrania tego jako MP3: kończy się takim wyjątkiem:
System.UriFormatException: Nieprawidłowy identyfikator URI: schemat URI jest nieprawidłowy.
   w System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
   w System.Uri..ctor(String uriString)
   w Pobieracz_v1._6.Form1.PobierzAsynchronicznie()
   w Pobieracz_v1._6.Form1.w_DownloadFileCompleted(Object sender, AsyncCompletedEventArgs e)
   w System.Net.WebClient.OnDownloadFileCompleted(AsyncCompletedEventArgs e)
   w System.Net.WebClient.DownloadFileOperationCompleted(Object arg)
  1. Przed wykonaniem wyszukiwania można klikać w przyciski dalej/wcześniej powodując w ten sposób wyjątek.

Jeśli chodzi o kod, to mogłoby go być jakieś 10 razy mniej.

  1. Takie rzeczy jak jakość filmiku powinny być opisane przez Enum, a nie przez zestaw wielu zmiennych typu bool!
  2. Oto fragment metody WyszukiwanieUtworuYouTube:
	if (array.Length == 1)
	{
		webRequest = WebRequest.Create("http://www.youtube.com/results?search_query=" + this._tytulUtworu1 + "&aq=f");
	}
	else
	{
		if (array.Length == 2)
		{
			webRequest = WebRequest.Create(string.Concat(new string[]
			{
				"http://www.youtube.com/results?search_query=", 
				array[0], 
				"+", 
				array[1], 
				"&aq=f"
			}));
		}
		else
		{
			if (array.Length == 3)
			{
				webRequest = WebRequest.Create(string.Concat(new string[]
				{
					"http://www.youtube.com/results?search_query=", 
					array[0], 
					"+", 
					array[1], 
					"+", 
					array[2], 
					"&aq=f"
				}));
			}
			else
			{
				if (array.Length == 4)
				{
					webRequest = WebRequest.Create(string.Concat(new string[]
					{
						"http://www.youtube.com/results?search_query=", 
						array[0], 
						"+", 
						array[1], 
						"+", 
						array[2], 
						"+", 
						array[3], 
						"&aq=f"
					}));
				}
				else
				{
					if (array.Length == 5)
					{
						webRequest = WebRequest.Create(string.Concat(new string[]
						{
							"http://www.youtube.com/results?search_query=", 
							array[0], 
							"+", 
							array[1], 
							"+", 
							array[2], 
							"+", 
							array[3], 
							"+", 
							array[4], 
							"&aq=f"
						}));
					}
					else
					{
						if (array.Length == 6)
						{
							webRequest = WebRequest.Create(string.Concat(new string[]
							{
								"http://www.youtube.com/results?search_query=", 
								array[0], 
								"+", 
								array[1], 
								"+", 
								array[2], 
								"+", 
								array[3], 
								"+", 
								array[4], 
								"+", 
								array[5], 
								"&aq=f"
							}));
						}
						else
						{
							if (array.Length == 7)
							{
								webRequest = WebRequest.Create(string.Concat(new string[]
								{
									"http://www.youtube.com/results?search_query=", 
									array[0], 
									"+", 
									array[1], 
									"+", 
									array[2], 
									"+", 
									array[3], 
									"+", 
									array[4], 
									"+", 
									array[5], 
									"+", 
									array[6], 
									"&aq=f"
								}));
							}
							else
							{
								if (array.Length == 8)
								{
									webRequest = WebRequest.Create(string.Concat(new string[]
									{
										"http://www.youtube.com/results?search_query=", 
										array[0], 
										"+", 
										array[1], 
										"+", 
										array[2], 
										"+", 
										array[3], 
										"+", 
										array[4], 
										"+", 
										array[5], 
										"+", 
										array[6], 
										"+", 
										array[7], 
										"&aq=f"
									}));
								}
								else
								{
									if (array.Length == 9)
									{
										webRequest = WebRequest.Create(string.Concat(new string[]
										{
											"http://www.youtube.com/results?search_query=", 
											array[0], 
											"+", 
											array[1], 
											"+", 
											array[2], 
											"+", 
											array[3], 
											"+", 
											array[4], 
											"+", 
											array[5], 
											"+", 
											array[6], 
											"+", 
											array[7], 
											"+", 
											array[8], 
											"&aq=f"
										}));
									}
									else
									{
										if (array.Length == 10)
										{
											webRequest = WebRequest.Create(string.Concat(new string[]
											{
												"http://www.youtube.com/results?search_query=", 
												array[0], 
												"+", 
												array[1], 
												"+", 
												array[2], 
												"+", 
												array[3], 
												"+", 
												array[4], 
												"+", 
												array[5], 
												"+", 
												array[6], 
												"+", 
												array[7], 
												"+", 
												array[8], 
												"+", 
												array[9], 
												"&aq=f"
											}));
										}
										else
										{
											if (array.Length == 11)
											{
												webRequest = WebRequest.Create(string.Concat(new string[]
												{
													"http://www.youtube.com/results?search_query=", 
													array[0], 
													"+", 
													array[1], 
													"+", 
													array[2], 
													"+", 
													array[3], 
													"+", 
													array[4], 
													"+", 
													array[5], 
													"+", 
													array[6], 
													"+", 
													array[7], 
													"+", 
													array[8], 
													"+", 
													array[9], 
													"+", 
													array[10], 
													"&aq=f"
												}));
											}
											else
											{
												if (array.Length == 12)
												{
													webRequest = WebRequest.Create(string.Concat(new string[]
													{
														"http://www.youtube.com/results?search_query=", 
														array[0], 
														"+", 
														array[1], 
														"+", 
														array[2], 
														"+", 
														array[3], 
														"+", 
														array[4], 
														"+", 
														array[5], 
														"+", 
														array[6], 
														"+", 
														array[7], 
														"+", 
														array[8], 
														"+", 
														array[9], 
														"+", 
														array[10], 
														"+", 
														array[11], 
														"&aq=f"
													}));
												}
												else
												{
													if (array.Length == 13)
													{
														webRequest = WebRequest.Create(string.Concat(new string[]
														{
															"http://www.youtube.com/results?search_query=", 
															array[0], 
															"+", 
															array[1], 
															"+", 
															array[2], 
															"+", 
															array[3], 
															"+", 
															array[4], 
															"+", 
															array[5], 
															"+", 
															array[6], 
															"+", 
															array[7], 
															"+", 
															array[8], 
															"+", 
															array[9], 
															"+", 
															array[10], 
															"+", 
															array[11], 
															"+", 
															array[12], 
															"&aq=f"
														}));
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}

Hmm... A co, jeśli podam 14 slów kluczowych? A gdyby tak użyć pętli?
Widzę, że podobne podejście stosujesz w metodach od zmiany strony wyszukiwania.
3. Metody 'PrzejscieDoNastepnejStronyYoutubeorazPrzejscieDoPoprzedniejStronyYoutube'' mają ponad 100 linijek, a różnią się jedną linijką kodu. Do tego ich końcowa część jest prawie identyczna jak ta w metodzie Wyszukaj.
4. Analogicznie jest w klasie Wrzuta.
5. O co chodzi z tym fragmentem metody KonwersjaDoMP3?

Form1 form = new Form1();
	form.timer1_Tick(this.sender, this.e);
  1. W Form1 metody obsługujące przyciski wyszukaj, dalej i poprzedni wyglądają tak:
if (this.rbWrzuta.Checked)
	// cośtam
if (this.rbYoutube.Checked)
   // dokładnie to samo co wyżej

Klasy YouTube i Wrzuta powinny dziedziczyć z jakiejś klasy abstrakcyjnej i udostępniać takie same metody, zaś klasa Form1 mogłaby mieć pole typu tej klasy abstrakcyjnej. Wtedy zmiana radiobuttona podstawiałaby jedynie pod pole klasy właściwy obiekt, a w reszcie aplikacji nie potrzebowałbyś ani jednego ifa do sprawdzenia, z którego portalu użytkownik chce pobierać pliki.
7. To nie jest Java, jeśli jest dużo opcji, to stosuje się switch, a nie else-if. Chociaż to trudno nawet else-if nazwać:

if (wyborJakosciYoutube.wybranaJakosc == 240)
			{
				this.pobieraniePlikuYoutube240();
			}
			else
			{
				if (wyborJakosciYoutube.wybranaJakosc == 360)
				{
					this.pobieranieplikuyoutube360();
				}
				else
				{
					if (wyborJakosciYoutube.wybranaJakosc == 480)
					{
						this.pobieraniePlikuYoutube480();
					}
					else
					{
						if (wyborJakosciYoutube.wybranaJakosc == 720)
						{
							this.pobieraniePlikuYoutube720();
						}
						else
						{
							if (wyborJakosciYoutube.wybranaJakosc == 1080)
							{
								this.pobieraniePlikuYoutube1080();
							}
							else
							{
								if (wyborJakosciYoutube.wybranaJakosc == 3)
								{
									this.flagaKontrolna = true;
									this.pobieranieplikuyoutube360();
								}
								else
								{
									MessageBox.Show("jakość nie wybrana");
								}
							}
						}
					}
				}
			}
  1. W powyższym kodzie w ogóle nie powinno być żadnej instrukcji warunkowej. Metody z zestawu pobieraniePlikuYoutue* są tak do siebie podobne, że można by je zastąpić jedną, przyjmującą w parametrze Enum opisujący jakość filmu.
  2. W każdej z tych metod powtarzasz sekwencję:
this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("\\u0026", "&");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("%3A%2F%2F", "://");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("%2F", "/");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("%3F", "?");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("%3D", "=");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("%252", "%2");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("%26", "&");
	this.sciezkaDoPobraniaYoutube = this.sciezkaDoPobraniaYoutube.Replace("\\/", "/");

Po pierwsze, nie wiem dlaczego wolałeś użyć kopiuj-wklej zamiast stworzyć metodę pomocniczą.
Po drugie, gdy masz tyle operacji do wykonania na stringu użyj klasy StringBuilder, będzie to rozwiązanie mniej pamięciożerne i szybsze.
Po trzecie, w tym przypadku powinieneś użyć słownika (Dictionary<string, string>), który zawierałby te pary ciągów do zastąpienia oraz pętli.
10. Przede wszystkim, wszystkie operacje "biznesowe", czyli u Ciebie głównie tworzenie urli i ściąganie plików nie powinny się w ogóle odbywać w klasie Form1. Ta klasa powinna jedynie obsługiwać akcje użytkownika (czyli np. zdarzenia przycisków) i wyświetlać mu informacje, nic więcej.
I jeszcze taka mała uwaga - WinForms powoli będzie umierało, obecnie lepiej chyba uczyć się nowocześniejszych technologii, takich jak WPF.

0

Uważaj bo Cię zgarną za piracenie youtube'a :D

0

Dzięki somekind za obszerną recenzję i konstruktywną krytykę.
Co do programu to postaram się poprawić te błędny o których wspomniałeś. A co do kodu(co mnie bardziej interesuje) rzeczywiście mogłoby być go zdecydowanie mniej. Największym problemem było zaprojektowanie aplikacji. Tej jak widać w ogóle nie projektowałem, ani nawet nie zastanawiałem się jak rozplanować klasy.
Na początku program miał tylko jedną funkcjonalność i na tym chciałem zakończyć ten "projekt", ale pomyślałem że go trochę rozszerzę, a rozszerzałem go metodą kopiuj-wklej jak widać.
Postaram się zrefaktoryzować kod(o ile to pojęcie w ogóle ma sens w tym przypadku : D ), na początek zastosuję się do twoich rad i wywale niepotrzebny kod, powtarzające się elementy zapakuje w jakieś metody, a później pomyślę jak to sensownie upchnąć w klasach żeby w głównej formie tylko wywoływać odpowiednie metody.
Podejścia obiektowego dopiero się uczę i widzę że sporo przede mną, bo chyba żadnych mechanizmów OOP nie zastosowałem w tym przypadku.

0

a ja mam pytanie na ile coś takiego jest legalne?
bo miałbym w planach zrobić podobny program tylko że do oglądania seriali (bez zapisywania trwałego na dysk, nic nie byłoby na moich serwerach, program przeszukiwałby tylko istniejące strony z serialami)

0

Ogólnie program fajny :) przyda się do szybkiego wyszukiwania mp3 moje zastrzeżenia to:

  • nie działa podgląd rozmiaru pliku z youtube,
  • kiedy klikam podgląd chciałbym aby piosenka już leciała a nie dodatkowo klikał jeszcze play
  • no i ten layout, hmm albo bym coś z nim zrobił albo usunął maksymalizację (ale raczej to pierwsze)
    ale ogólnie +1 :)
0

Wyłapałem błąd, a mianowicie po uruchomieniu programu i kliknięcia buttona z strzałką w prawo/lewo wyskakuje wyjątek:

System.NullReferenceException: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
   w Pobieracz_v1._6.Wrzuta.PrzejscieDoNastepnejStronyWrzuta()
   w Pobieracz_v1._6.Form1.bDalej_Click(Object sender, EventArgs e)
   w System.Windows.Forms.Control.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   w System.Windows.Forms.Control.WndProc(Message& m)
   w System.Windows.Forms.ButtonBase.WndProc(Message& m)
   w System.Windows.Forms.Button.WndProc(Message& m)
   w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   w System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Poza tym ustawiłbym button podgląd jako niedostępny kiedy nie jest wybrany plik:)

0

Wrzucam trochę poprawiony kod projektu, z pytaniem czy te zmiany idą w dobrą stronę i czy klasy powinny być w ten sposób "zaplanowane"?
user image

Kod: http://www.przeklej.pl/plik/pobieracz-v1-6-rar-0044q8ad31qi3sp

1

Co do wyglądu to wydaje się lepszy od poprzedniej wersji, tylko nie ma buttona szukaj, intuicyjnie daje enter i szuka, ale button powinien być :D Można przesuwać strzałkami nawet gdy lista jest pusta, co powinno być zablokowane i teraz odblokowałbym maksymalizacje, jeśli poprawiłeś layout :)

0

Coś przeklej pozmieniał, więc wrzucam nowy link: http://www.sendspace.pl/file/7d2e9e015710a191e164d41
Ale chyba porzucę grzebanie w tym kodzie, bo nie mogę go ogarnąć...
Przepisuje to od nowa, starając sie w miarę pilnować.
Kod: http://code.google.com/p/pobieracz-nowy/ (zintegrowane z SVN)

3

gdzie mieszkasz?

0

"Hołdysie" ty [CIACH!], a jak nagrywałem sobie "Szklaną Pułapkę" na vhs, to też popełniałem zbrodnię? jak chciałem sobie puścić na wideo film nagrany z telewizji to już oznaczało że jestem jednym z szemranych?

Czym się różni nagrywanie filmu na kasetę wideo, od nagrania filmu na plik w jakimkolwiek formacie?
Zanim ktoś zacznie bełkotać o prawach do własności intelektualnej, niech włączy kumator.

Program zapowiada się całkiem fajny, podoba mi się też podejście prisixn do robienia tego programiku :)

//Oczywiście zwracając się do Hołdysa, mam na myśli tego w społeczeństwie rozpoznawanego... i słowo jeszcze:
Panie Hołdys, nie da się o niektórych rzeczach stworzonych powiedzieć "moje moje tylko moje", taka natura tych rzeczy.

0

Ze screena prezentuje się ok, ale ja lama z doświadczeniem tylko w Delphi tego nie będę próbowal skompilowąc. Stąd prośba, bo chciałem ocenić działanie binarki, gdyż nie znam dobrze innych języków programowania poza "jako taką" znajomością Delphi, więc nie będę oceniał kodu. Także prosił bym o wrzucenie binarki do testowania po uruchomieniu exeka.

0

Trochę nie rozumiem tego kodu:

if (Directory.Exists(folderTemp + "/tempMp3"))
{
}
else
{
    Directory.CreateDirectory(folderTemp + "/tempMp3");
} 

;)

Czyżbyś tworzył projekt o nazwiePobieracz_v1.6? Wszędzie masz taką przestrzeń nazw:

namespace Pobieracz_v1._6

Ja raczej nazwałbym program Pobieracz, a wersje ustawiał we właściwościach projektu.

Ogólnie masz bałagan straszny - np. metoda sprawdzDostepneJakosci w klasie WyborJakosciYoutube jest w ogóle nieużywana!
Za to w klasie Form1 wygląda tak:

  private void sprawdzDostepneJakosci()
        {
            string[] tablicaWzorow = { @"tag=18,url", @"tag=34,url", @"tag=44,url", @"tag=45,url", @"quality=hd1080" };
            string zrodloDoSprawdzenia = "";
            zrodloDoSprawdzenia = tekst;
            for (int i = 0; i < tablicaWzorow.Length; i++)
            {
                Regex rgx = new Regex(tablicaWzorow[i], RegexOptions.IgnoreCase);
                MatchCollection matches = rgx.Matches(zrodloDoSprawdzenia);
                foreach (Match match in matches)
                {
                    if (match.ToString() == tablicaWzorow[0])
                    {
                        x240 = true;
                    }
                    else if (match.ToString() == tablicaWzorow[1])
                    {
                        x360 = true;
                    }
                    else if (match.ToString() == tablicaWzorow[2])
                    {
                        x480 = true;
                    }
                    else if (match.ToString() == tablicaWzorow[3])
                    {
                        x720 = true;
                    }
                    else if (match.ToString() == tablicaWzorow[4])
                    {
                        x1080 = true;
                    }
                }
            }
        }

Metoda zamiast przyjmować argument i zwraca wynik operuje na "globalnych" dla niej polach klasy. Nieładnie tak.
Poza tym, przyjrzyj się - w pętli for wyszukujesz w źródle strony jakiegoś ciągu znaków, który może w niej wystąpić co najwyżej raz, a następnie w foreach dla każdego z 0 lub 1 znalezionych ciągów, sprawdzasz szereg warunków, z których tylko jeden może być prawidłowy - ten, w którym i == tablicaWzorow[x]...
O ile prościej byłoby użyć Regex.IsMatch.

W konstruktorze tego okna ustawiasz sobie wartości jakichś prywatnych pól bool, żeby po chwili w zdarzeniu Load je odczytać i na ich podstawie wyświetlić radiobuttony. Czemu tak na około? Zwracanie informacji też się odbywa na około - przekształcasz bool na int. Pisałem już, żebyś użył enuma.

  1. Najpierw definicja enuma:
namespace Pobieracz_v1._6.Core
{
    public enum DownloadQuality
    {
        None = 0, 
        V240 = 1, 
        V360 = 2, 
        V480 = 4, 
        V720 = 8, 
        V1080 = 16, 
        MP3 = 32,
    }
}
  1. Następnie przerabiamy okno wyboru jakości:
using System;
using System.Windows.Forms;
using Pobieracz_v1._6.Core;

namespace Pobieracz_v1._6
{
    public partial class WyborJakosciYoutube : Form
    {
        public DownloadQuality DownloadQuality
        {
            get
            {
                if (this.rb1080.Checked)
                {
                    return DownloadQuality.V1080;
                }
                if (this.rb240.Checked)
                {
                    return DownloadQuality.V240;
                }
                if (this.rb360.Checked)
                {
                    return DownloadQuality.V360;
                }
                if (this.rb480.Checked)
                {
                    return DownloadQuality.V480;
                }
                if (this.rb720.Checked)
                {
                    return DownloadQuality.V720;
                }
                if (this.rbMp3.Checked)
                {
                    return DownloadQuality.MP3;
                }

                return Core.DownloadQuality.None;
            }
        }

        public WyborJakosciYoutube(DownloadQuality quality)
        {
            InitializeComponent();

            this.rb240.Visible = (quality & DownloadQuality.V240) == DownloadQuality.V240;
            this.rb360.Visible = (quality & DownloadQuality.V360) == DownloadQuality.V360;
            this.rb480.Visible = (quality & DownloadQuality.V480) == DownloadQuality.V480;
            this.rb720.Visible = (quality & DownloadQuality.V720) == DownloadQuality.V720;
            this.rb1080.Visible = (quality & DownloadQuality.V1080) == DownloadQuality.V1080;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
    }
}

Kod monotonny, ale i tak jest go o 100 linijek mniej niż w oryginale.

Trzeba też pamiętać, aby w designerze ustawić Visible wszystkich radiobuttonów na false.

  1. Jeśli chodzi o sprawdzanie w jakiej jakości możemy coś ściągnąć z YT, to po pierwsze zróbmy do tego oddzielną klasę, a po drugie nie trzeba ani zagnieżdżonych pętli, ani miliona ifów, ani nawet Regexa:
 using System.Collections.Generic;

namespace Pobieracz_v1._6.Core
{
	class YoutubeOperator
	{
		private static Dictionary<string, DownloadQuality> qualityPatterns = new Dictionary<string, DownloadQuality>()
		{ 
			{ @"tag=18,url", DownloadQuality.V240 },
			{ @"tag=34,url", DownloadQuality.V360 },
			{ @"tag=44,url", DownloadQuality.V480 },
			{ @"tag=45,url", DownloadQuality.V720 },
			{ @"quality=hd1080", DownloadQuality.V1080 },
		};

		public static DownloadQuality GetQualityOptions(string source)
		{
			DownloadQuality result = DownloadQuality.None;
			foreach (var pattern in qualityPatterns)
			{
				if (source.Contains(pattern.Key))
				{
					result |= pattern.Value;
				}
			}

			return result;
		}
	}
}
  1. Użycie w kodzie Form1:
DownloadQuality dq = YoutubeOperator.GetQualityOptions(tekst);
using (WyborJakosciYoutube okno = new WyborJakosciYoutube(dq))
{
    if (okno.ShowDialog() == DialogResult.OK)
    {
        switch (okno.DownloadQuality)
        {
            case DownloadQuality.None:
                break;
            case DownloadQuality.V240:
                pobierzWybranaJakosc(youtParametry[0]);
                break;
            case DownloadQuality.V360:
                pobierzWybranaJakosc(youtParametry[1]);
                break;
            case DownloadQuality.V480:
                pobierzWybranaJakosc(youtParametry[2]);
                break;
            case DownloadQuality.V720:
                pobierzWybranaJakosc(youtParametry[3]);
                break;
            case DownloadQuality.V1080:
                pobierzWybranaJakosc(youtParametry[4]);
                break;
            case DownloadQuality.MP3:
                flagaKontrolna = true;
                pobierzWybranaJakosc(youtParametry[0]);
                break;
            default:
                break;
        }
    }
} 

Oczywiście to też jest do poprawki, przede wszystkim trzeba zrobić jakiś słownik zamiast tego youtParametry czymkolwiek to jest...

0

Nie można otagować/zdziedziczyć, zamiast walić drabinki ifów i caseów?

1 użytkowników online, w tym zalogowanych: 0, gości: 1