|
|
|
C# WinApp/WPF โค้ดเดียวกันแต่ได้ผลออกมาไม่เหมือนกัน |
|
|
|
|
|
|
|
ช่วงนี้เงียบๆ จัดมาซัก 1 คำถามดีกว่า(55555)
ผมกำลังเขียนโปรแกรมโหลดไฟล์จาก ยูทูป ที่เป็น playlist อยู่ ครับ
แต่ติดปัญหาว่า
โค้ด
Code (C#)
void _Load()
{
Process process = new Process
{
StartInfo =
{
FileName = Properties.Settings.Default.YoutubeDlPath,
Arguments = string.Format("--ignore-errors --no-post-overwrites --output \"{0}\" {1}", @"d:\เพชรพระอุมา ภาคสมบูรณ์ ตอนที่ 28.mp4", @"https://www.youtube.com/watch?v=uTAzQoyw6pM"),
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
},
EnableRaisingEvents = true
};
process.Exited += new EventHandler((object sender, EventArgs e) =>
{
process.Dispose();
});
Task.Run(() => process.Start()).Wait();
}
แปลกตรงที่มันรันใน winapp ไม่มีอะไรเกิดขึ้น
แต่รันใน WPF กลับทำงานปกติ
และโค้ด
Code (C#)
private void GetLink()
{
string strpettern = @"{""webCommandMetadata"":{""url"":""(/watch\?v=.{10,20}\.*?list=.{25,40}\.*?index=)(\d{1,})""";//@"""url"":""(/watch\?v=.*?index=)(\d{1,})""";
Regex myRegex = new Regex(strpettern, RegexOptions.None);
do
{
string html = TorServices.NetWorkTOR.getHTML (_url);
foreach (Match myMatch in new Regex(strpettern, RegexOptions.None).Matches(html))
{
string myMatchURL = "https://www.youtube.com" + (myMatch.Groups[1].Value + myMatch.Groups[2].Value).Replace(@"\u0026", "&");
if (!PlaylistAll.Contains(myMatchURL) && myMatchURL.Length < 300)
{
if (int.Parse(myMatch.Groups[2].Value) > index)
{
surl = myMatchURL;
index = int.Parse(myMatch.Groups[2].Value);
}
PlaylistAll += myMatchURL + "\n";
lblStatus.Invoke(new Action(() => lblStatus.Text = "Status:Adding>>" + myMatchURL));
dataGridView1.Invoke(new Action(() => dataGridView1.Rows.Add(YoutubeSearcher.GetTitletName(myMatchURL), myMatchURL, 0, PlaylistName)));//YoutubeSearcher.GetTitletName(myMatchURL)
i++;
}
}
if (surl != _url)
{
_url = surl;
}
}
while (surl != _url);
}
กลับใช้งานได้ดีใน winapp ส่วน wpf ใช้ไม่ได้ คือใน wpf มันไม่ดึงค่า index=1 ออกมาเหมือนใน winapp
ไม่เข้าใจว่าเกิดจาดอะไรครับ
ทั้ง winapp และ WPF ลองสร้างใหม่หลายโปรเจคแล้วผลก็ได้เหมือนเดิม ครับ
Tag : .NET, Win (Windows App), C#
|
|
|
|
|
|
Date :
2020-09-12 09:54:34 |
By :
lamaka.tor |
View :
1561 |
Reply :
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
API มีสำหรับ .NET โดยตรงครับ
แต่ผมแนะนำให้ใช้ JS
JS = JavaScript
เป็น Web Technology
การเรียกใช้งาน JS ใน Desktop App
พึ่งพวก Web Browser control (ของใหม่ Microsoft ก็ WebView2)
หรือ ถ้าเครื่องใช้งานไม่ได้ลง Edge
ลองถามเป็ดดูครับ
https://duckduckgo.com/?q=js+in+winform+c%23
|
|
|
|
|
Date :
2020-09-12 22:44:34 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ทราบว่าขอคำแนะนำเรื่อง HtmlAgilityPack ได้ไม๊ครับ
เพิ่งลองหัดใช้
ไม่รู้ว่า เวลาเราจะดึงค่าออกมาต้องดึงค่ายังไง ครับ
เห็นในตัวอย่าง
https://html-agility-pack.net/online-examples
มีการดึงค่า ออกมา แต่ผมไม่ถนัด และ ไปไม่ถูกเลยครับ
คือจะดึงค่า "simpleText": และ "commandMetadata":{"webCommandMetadata":
ออกมา ซึ่งจะได้ ชื่อเพลง และ ลิงค์ ออกมาเลยครับ
|
|
|
|
|
Date :
2020-09-13 22:56:37 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมลองกลับมาใช้
Code (C#)
private void GetLink()
{
this.Invoke(new Action(()=> this.Text = "runing"));
string strpettern = @"{""title"":{""accessibility"":{""accessibilityData"":{""label"":"".{5,600}""}},""simpleText"":""(.{5,600})""},""longBylineText"":.*?""commandMetadata"":{""webCommandMetadata"":{""url"":""(/watch\?v=.{10,30}\.*?list=.{20,50}\.*?index=)(\d{1,})"",""webPageType"":";
Regex myRegex = new Regex(strpettern, RegexOptions.Compiled);
string _url; int i = 1, index = 1; string surl = "", PlaylistAll= "";
_url = @"https://www.youtube.com/watch?v=FZxobySebhk&list=PLdawj7HD1Qn64RAbw23S-ZFWzoVqtfXFB";
// string strpettern = @"{""webCommandMetadata"":{""url"":""(/watch\?v=.{10,20}\.*?list=.{25,40}\.*?index=)(\d{1,})""";//@"""url"":""(/watch\?v=.*?index=)(\d{1,})""";
DateTime dt1 = DateTime.Now;
bool complete = false;
do
{
string html = TorServices.NetWorkTOR.getHTML(_url);
foreach (Match myMatch in new Regex(strpettern, RegexOptions.None).Matches(html))
{
string myMatchURL = "https://www.youtube.com" + (myMatch.Groups[2].Value + myMatch.Groups[3].Value).Replace(@"\u0026", "&");
if (!PlaylistAll.Contains(myMatchURL) && myMatchURL.Length < 300)
{
if (int.Parse(myMatch.Groups[3].Value) > index)
{
surl = myMatchURL;
index = int.Parse(myMatch.Groups[3].Value);
i++;
}
PlaylistAll += myMatchURL + "\n";
richTextBox1.WriteLine(myMatch.Groups[1].Value + " " + myMatchURL);
}
}
if (surl == _url)
{
complete = true;
}
else
{
_url = surl;
}
}
while (complete == false);
TimeSpan span = DateTime.Now.Subtract(dt1);
this.Invoke(new Action(() => this.Text = "time:" + span.Hours.ToString("00") + ":" + span.Minutes.ToString("00") + ":" + span.Seconds.ToString("00") + ":" + span.Milliseconds.ToString("000") + " Total Link:" + i));
}
จะดึง ชื่อเพลง กับ link มารอบเดียวไม่ต้องเอา link ไป ดึงชื่อเพลงมาอีกรอบ
เร็วจริง แต่ ต้องแก้ปัญหาที่ว่า มันดึงมาได้มั่งไม่ได้มั่ง
ไม่รู้ว่า ตอนเอา url ไป อ่านเป็น HTML มีปัญหา หรือว่า แต่ละรอบมันไม่เหมือนกันหรือปล่าว
Code (C#)
public static string getHTML(this string url)
{
var html = "";
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url.Trim());
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream());
html = sr.ReadToEnd();
sr.Close();
response.Close();
}
catch { }
return html;
}
เท่าที่ลองสังเกตดู
ตัวที่ช้า คือ getHTML ครับ
ในส่วนของ Regex ถือว่าเร็วพอสมควร
พอจะขึ้น url ใหม่ มันจะช้าซักหน่อย เดาเอาว่า ตัวรายละเอียดเว็บมันเยอะ เลยทำให้อ่านช้าหน่อยครับ
มีโค้ดอ่าน url ที่เร็วขึ้นไม๊ ครับ
|
|
|
|
|
Date :
2020-09-14 00:16:22 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ได้ครับ เดี๋ยวจะลองสู้กับ JSON ซักตั้งดู
เลี่ยงมันมานานแล้วครับ
|
|
|
|
|
Date :
2020-09-14 08:02:07 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 01
|