[Release] Download Launcher v0.1

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
    Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

    • [Release] Download Launcher v0.1

      Da ich dies einfach aus rein Lern Interesse gemacht habe veröffentliche ich dies nun.
      Mir ist bewusst, dass es eventuell nicht Resourcen Sparend oder optimiert ist, jedoch hat es einfach Spaß gemacht, etwas zu schreiben was vielleicht ein oder anderes Projekt nützlich sein könnte.

      Wie funktioniert das?
      Ganz einfach ! Ihr ladet eure Dateien auf ein Webspace hoch, samt der PHP Datei und passt diese ggf. an, wenn ihr dies gemacht habt führt die PHP Datei aus und der Server erstellt eine XML Datei.
      Das Programm nimmt sich diese und verarbeitet dies und fügt das in eine Downloadliste ein und am Ende sollte dann alles runtergeladen werden.

      Die Hauptseite arbeitet mit RSS Feed, fand ich in dem Moment am einfachsten. Habe Breadfish als Testzwecke Missbraucht aufs übelste.

      Wichtig!
      Das Programm ist noch nicht zu 100 % fertig und wird von mir ein bisschen weiterentwickelt, Design änderbar etc
      Selbstverständlich ist das Programm nicht fehlerfrei und kann BUgs beinhalten diese könnt ihr gerne hier rein Schreiben, werde es dann ggf., wenn Zeit da ist beheben.

      Hoffe trotzdem das es gut ankommt.


      Bilder:



      Sourcecode von der Hauptdatei

      C-Quellcode: Form1.cs

      1. using System;
      2. using System.Collections.Generic;
      3. using System.ComponentModel;
      4. using System.Diagnostics;
      5. using System.Drawing;
      6. using System.IO;
      7. using System.Linq;
      8. using System.Net;
      9. using System.Windows.Forms;
      10. using System.Xml;
      11. using Koopakiller.NewsFeed;
      12. using MetroFramework;
      13. using MetroFramework.Forms;
      14. namespace AG_Launcher
      15. {
      16. public partial class Form1 : MetroForm
      17. {
      18. int fileLoadedCount;
      19. int getAllFilesCount;
      20. long getServerSize;
      21. bool isPauseDownload;
      22. private string URLDownload = "LINK ZUR XML Datei";
      23. private string rss_feed_url = "RSS FEED LINK";
      24. private Button[] _Buttons;
      25. private Button[] noButton;
      26. private Queue<string> DownloadList = new Queue<string>();
      27. private Queue<string> DownloadFolder = new Queue<string>();
      28. WebClient _downloader;
      29. Stopwatch sw = new Stopwatch();
      30. ag_function AppFunction = new ag_function();
      31. public Form1()
      32. {
      33. InitializeComponent();
      34. this.BorderStyle = MetroFormBorderStyle.FixedSingle;
      35. this.ShadowType = MetroFormShadowType.AeroShadow;
      36. }
      37. private void Form1_Load(object sender, EventArgs e)
      38. {
      39. if (AppFunction.getAppSetting("firstStart") == "true")
      40. {
      41. DialogResult result = MetroMessageBox.Show(this, "Dies scheint dein erster Start zu sein, dieses Programm ist noch in der Entwicklung. Bitte melde Bugs oder Vorschläge im Forum.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
      42. if(result == DialogResult.OK)
      43. {
      44. AppFunction.setAppSetting("firstStart", "false");
      45. }
      46. }
      47. else
      48. {
      49. PathGTAV.Text = AppFunction.getAppSetting("GTAVPath");
      50. }
      51. loadNewsPage();
      52. }
      53. private void closeBtn_Click(object sender, EventArgs e)
      54. {
      55. this.Close();
      56. }
      57. private void hideBtn_Click(object sender, EventArgs e)
      58. {
      59. this.WindowState = FormWindowState.Minimized;
      60. }
      61. private void metroListView1_SelectedIndexChanged(object sender, EventArgs e)
      62. {
      63. }
      64. private void loadAllDatabtn_Click(object sender, EventArgs e)
      65. {
      66. getAllFilesCount = 0;
      67. if (File.Exists(PathGTAV.Text + "/PlayGTAV.exe") == false)
      68. {
      69. DialogResult folderError = MetroMessageBox.Show(this, "Bitte wähle erst dein GTA V Ordner aus.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
      70. if (folderError == DialogResult.OK)
      71. {
      72. DialogResult FolderSearch = findGTAVFolder.ShowDialog();
      73. if (FolderSearch == DialogResult.OK)
      74. {
      75. if (File.Exists(findGTAVFolder.SelectedPath + "/PlayGTAV.exe") == false)
      76. {
      77. MetroMessageBox.Show(this, "Die \"PlayGTAV.exe\" wurde nicht gefunden!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
      78. }
      79. else
      80. {
      81. PathGTAV.Text = findGTAVFolder.SelectedPath;
      82. if (Directory.Exists(PathGTAV.Text + "/mods") == false)
      83. {
      84. Directory.CreateDirectory(PathGTAV.Text + "/mods");
      85. }
      86. }
      87. }
      88. }
      89. }
      90. fileListLoad.Nodes.Clear();
      91. DownloadList.Clear();
      92. DownloadFolder.Clear();
      93. XmlTextReader DataReader = new XmlTextReader(URLDownload + "/files.xml");
      94. while(DataReader.Read())
      95. {
      96. if(DataReader.IsStartElement())
      97. {
      98. switch(DataReader.Name)
      99. {
      100. case "file":
      101. if(DataReader.GetAttribute("folder") == "true")
      102. {
      103. DownloadFolder.Enqueue(PathGTAV.Text + "/mods/" + DataReader.GetAttribute("name"));
      104. }
      105. else if (DataReader.GetAttribute("folder") == "false")
      106. {
      107. if(File.Exists(PathGTAV.Text + "/mods/" + DataReader.GetAttribute("name")) == false)
      108. {
      109. fileListLoad.Nodes.Add(DataReader.GetAttribute("name"));
      110. DownloadList.Enqueue(DataReader.GetAttribute("name"));
      111. getAllFilesCount++;
      112. }
      113. else
      114. {
      115. FileInfo fi = new FileInfo(@PathGTAV.Text + "/mods/" + DataReader.GetAttribute("name"));
      116. if (ag_function.CalculateMD5(@PathGTAV.Text + "/mods/" + DataReader.GetAttribute("name")) != DataReader.GetAttribute("md5"))
      117. {
      118. fileListLoad.Nodes.Add(DataReader.GetAttribute("name"));
      119. DownloadList.Enqueue(DataReader.GetAttribute("name"));
      120. getAllFilesCount++;
      121. }
      122. }
      123. if(DownloadList.Any())
      124. {
      125. downloadBtn.Enabled = true;
      126. pauseBtn.Enabled = true;
      127. stoppBtn.Enabled = true;
      128. }
      129. }
      130. break;
      131. case "allSize":
      132. getServerSize = Convert.ToInt32(DataReader.GetAttribute("size"));
      133. break;
      134. }
      135. }
      136. }
      137. muchFileLoadedCount.Text = fileLoadedCount + " / " + getAllFilesCount + " Dateien";
      138. folderSizeLBL.Text = Convert.ToString(AppFunction.ConvertBytesToMegabytes(AppFunction.GetDirectorySize(PathGTAV.Text + "/mods", true))) + " / " + Convert.ToString(AppFunction.ConvertBytesToMegabytes(getServerSize)) + " mb";
      139. }
      140. private void fontDialog1_Apply(object sender, EventArgs e)
      141. {
      142. }
      143. private void gamePath_Click(object sender, EventArgs e)
      144. {
      145. DialogResult folderError = MetroMessageBox.Show(this, "Bitte wähle dein GTA V Ordner aus.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Information);
      146. if (folderError == DialogResult.OK)
      147. {
      148. DialogResult FolderSearch = findGTAVFolder.ShowDialog();
      149. if (FolderSearch == DialogResult.OK)
      150. {
      151. if (File.Exists(findGTAVFolder.SelectedPath + "/PlayGTAV.exe") == false)
      152. {
      153. MetroMessageBox.Show(this, "Die \"PlayGTAV.exe\" wurde nicht gefunden!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
      154. }
      155. else
      156. {
      157. PathGTAV.Text = findGTAVFolder.SelectedPath;
      158. AppFunction.setAppSetting("GTAVPath", PathGTAV.Text);
      159. if (Directory.Exists(PathGTAV.Text + "/mods") == false)
      160. {
      161. Directory.CreateDirectory(PathGTAV.Text + "/mods");
      162. }
      163. }
      164. }
      165. }
      166. }
      167. private void downloadBtn_Click(object sender, EventArgs e)
      168. {
      169. if(DownloadFolder.Any())
      170. {
      171. foreach(string DownloadCreateFolder in DownloadFolder)
      172. {
      173. DirectoryInfo info = Directory.CreateDirectory(DownloadCreateFolder.ToString());
      174. }
      175. }
      176. if(DownloadList.Any())
      177. {
      178. loadAllDatabtn.Enabled = false;
      179. DownloadHandleAsync();
      180. }
      181. else { AddLogData("Keine Dateien zum laden gefunden!"); }
      182. }
      183. private void downloadBG_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
      184. {
      185. }
      186. private void DownloadHandleAsync()
      187. {
      188. int lastCount = 0;
      189. using (WebClient downloader = new WebClient())
      190. {
      191. if (downloader.IsBusy == false)
      192. {
      193. if (DownloadList.Any())
      194. {
      195. if (AppFunction.URLExists(URLDownload + "/files" + DownloadList.First()))
      196. {
      197. _downloader = downloader;
      198. sw.Reset();
      199. string[] words = DownloadList.First().Split('/');
      200. for (int i = 0; i < words.Length; i++)
      201. {
      202. lastCount = i;
      203. }
      204. currentFile.Text = words[lastCount];
      205. downloader.DownloadFileAsync(new Uri(URLDownload + "/files" + DownloadList.First()), PathGTAV.Text + "/mods/" + DownloadList.First());
      206. downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloader_DownloadProgressChanged);
      207. downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(downloader_DownloadFileCompleted);
      208. sw.Start();
      209. }
      210. else
      211. AddLogData("[Downloader] Keine Dateien gefunden. " + URLDownload + "/files" + DownloadList.First());
      212. }
      213. }
      214. }
      215. }
      216. private void downloader_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
      217. {
      218. downloadProgressBar.Value = e.ProgressPercentage;
      219. downloadPercent.Text = Convert.ToString( e.ProgressPercentage ) + "%";
      220. speedLBL.Text = AppFunction.ConvertBytesToMegabytes(e.BytesReceived) + "mb /" + AppFunction.ConvertBytesToMegabytes(e.TotalBytesToReceive) + "mb";
      221. dlspeed.Text = string.Format("{0} mb/s", (e.BytesReceived / 1024d / 1024d / sw.Elapsed.TotalSeconds).ToString("0.00"));
      222. }
      223. private void downloader_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
      224. {
      225. if (e.Cancelled)
      226. {
      227. File.Delete(PathGTAV.Text + "/mods/" + DownloadList.First());
      228. return;
      229. }
      230. if (e.Error != null)
      231. MessageBox.Show(e.Error.Message);
      232. else
      233. {
      234. downloadProgressBarAll.Value = Convert.ToInt16(100 * AppFunction.ConvertBytesToMegabytes(AppFunction.GetDirectorySize(PathGTAV.Text + "/mods", true)) / AppFunction.ConvertBytesToMegabytes(getServerSize));
      235. folderSizeLBL.Text = Convert.ToString(AppFunction.ConvertBytesToMegabytes(AppFunction.GetDirectorySize(PathGTAV.Text + "/mods", true))) + " / " + Convert.ToString(AppFunction.ConvertBytesToMegabytes(getServerSize)) + " mb";
      236. downloadPercentAll.Text = Convert.ToString(downloadProgressBarAll.Value) + "%";
      237. string deleteFile = DownloadList.Dequeue();
      238. fileLoadedCount++;
      239. if(fileListLoad.Nodes.Count > 0) fileListLoad.Nodes.RemoveAt(0);
      240. muchFileLoadedCount.Text = fileLoadedCount + " / " + getAllFilesCount + " Dateien";
      241. if (DownloadList.Any())
      242. {
      243. //AddLogData("[Downloader] Nächste Datei wird geladen. Datei: " + DownloadList.First());
      244. DownloadHandleAsync();
      245. return;
      246. }
      247. downloadProgressBar.Value = 0;
      248. downloadProgressBarAll.Value = 0;
      249. loadAllDatabtn.Enabled = true;
      250. downloadBtn.Enabled = false;
      251. pauseBtn.Enabled = false;
      252. stoppBtn.Enabled = false;
      253. dlspeed.Text = "0 mb/s";
      254. muchFileLoadedCount.Text = "0/0";
      255. speedLBL.Text = "0 mb/s";
      256. downloadPercent.Text = "0%";
      257. downloadPercentAll.Text = "0%";
      258. folderSizeLBL.Text = "0";
      259. fileLoadedCount = 0;
      260. getAllFilesCount = 0;
      261. AddLogData("Dateien erfolgreich geladen!");
      262. }
      263. }
      264. private void AddLogData(string text)
      265. {
      266. statusLBL.Text = text;
      267. }
      268. private void muchFileFoundCount_Click(object sender, EventArgs e)
      269. {
      270. }
      271. private void metroTile1_Click(object sender, EventArgs e)
      272. {
      273. _downloader.CancelAsync();
      274. downloadBtn.Enabled = true;
      275. }
      276. private void metroTile2_Click(object sender, EventArgs e)
      277. {
      278. if (isPauseDownload == false) isPauseDownload = true;
      279. else if (isPauseDownload == true) isPauseDownload = false;
      280. }
      281. private void loadNewsPage()
      282. {
      283. _Buttons = new Button[22];
      284. noButton = new Button[1];
      285. int getOldPos = -1;
      286. int Index_ = 0;
      287. WebClient webClient = new WebClient();
      288. webClient.Headers.Add("user-agent", "MyRSSReader/1.0");
      289. RSSFeed rss_read = new RSSFeed();
      290. rss_read.Load(webClient.OpenRead(rss_feed_url));
      291. foreach (RSSFeedArticle feed in rss_read.Articles)
      292. {
      293. Index_++;
      294. if(getOldPos == -1) getOldPos = 0;
      295. else getOldPos = getOldPos + 45;
      296. _Buttons[Index_] = new MetroFramework.Controls.MetroTile
      297. {
      298. Location = new Point(3, getOldPos),
      299. Name = feed.Title,
      300. Size = new Size(212, 41),
      301. TabIndex = 0,
      302. Text = feed.Title,
      303. };
      304. scrollable.Controls.Add(_Buttons[Index_]);
      305. _Buttons[Index_].Click += new System.EventHandler(testButton_Click);
      306. }
      307. if(Index_ == 0)
      308. {
      309. noButton[0] = new MetroFramework.Controls.MetroTile
      310. {
      311. Location = new Point(3, 0),
      312. Size = new Size(212, 41),
      313. TabIndex = 0,
      314. Text = "Keine Neuigkeiten!",
      315. };
      316. scrollable.Controls.Add(noButton[0]);
      317. noButton[0].Click += new System.EventHandler(refreshButton_Click);
      318. }
      319. AddLogData("" + Index_);
      320. }
      321. private void testButton_Click(object sender, EventArgs e)
      322. {
      323. Button btn = sender as Button;
      324. WebClient webClient = new WebClient();
      325. webClient.Headers.Add("user-agent", "MyRSSReader/1.0");
      326. RSSFeed rss_read = new RSSFeed();
      327. rss_read.Load(webClient.OpenRead(rss_feed_url));
      328. foreach (RSSFeedArticle feed in rss_read.Articles)
      329. {
      330. if (feed.Title == btn.Text)
      331. {
      332. loadBrowserPage.DocumentText = feed.Content;
      333. }
      334. AddLogData(feed.ArticleUrl);
      335. }
      336. }
      337. private void refreshButton_Click(object sender, EventArgs e)
      338. {
      339. loadNewsPage();
      340. AddLogData("Neuigikeiten neu geladen!");
      341. }
      342. }
      343. }
      Alles anzeigen


      PHP Datei:

      PHP-Quellcode: mods.php

      1. <?php
      2. error_reporting(E_ALL);
      3. $alledateien = scandir('files');
      4. $dom = new DOMDocument('1.0', 'utf-8');
      5. $root = $dom->createElement('data');
      6. $dom->appendChild($root);
      7. function directoryScan($dir) {
      8. if (isset($dir) && is_readable($dir)) {
      9. $directionList = Array();
      10. $dir = realpath($dir);
      11. $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir,FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);
      12. $x = 0;
      13. foreach($objects as $entry => $object){
      14. $getpath = str_replace($dir, '', $entry);
      15. $size = ceil($object->getSize());
      16. $changed = date($object->getMTime());
      17. $directionList[$x]['path'] = $getpath;
      18. $directionList[$x]['size'] = $size;
      19. $directionList[$x]['changed'] = $changed;
      20. $x ++;
      21. }
      22. return $directionList;
      23. }
      24. }
      25. $allSize = 0;
      26. foreach (directoryScan('files') as $datei)
      27. {
      28. if ($datei != "." && $datei != ".." && $datei != "files.xml" && $datei != "server.xml")
      29. {
      30. $root->appendChild($firstNode = $dom->createElement("file"));
      31. $firstNode->setAttribute("name", $datei['path']);
      32. $firstNode->setAttribute("md5", md5_file("files/". $datei['path']));
      33. $firstNode->setAttribute("sizeFile", $datei['size']);
      34. if (is_dir("files/". $datei['path']) == true) {
      35. $firstNode->setAttribute("folder", "true");
      36. }else{
      37. $firstNode->setAttribute("folder", "false");
      38. }
      39. $allSize += $datei['size'];
      40. }
      41. };
      42. $root->appendChild($firstNode = $dom->createElement("allSize"));
      43. $firstNode->setAttribute("size", $allSize);
      44. header('Content-type: text/xml; charset=utf-8');
      45. echo $dom->saveXML();
      46. $handle = fopen ("files.xml", "w");
      47. fwrite ($handle, $dom->saveXML());
      48. fclose ($handle);
      49. ?>
      Alles anzeigen

      Im Anhang habe ich den ganzen Ordner samt PHP Datei eingefügt.


      Mfg #Jerola
      Dateien
      • AG Launcher.rar

        (1,44 MB, 14 mal heruntergeladen, zuletzt: )