Files
A69WD/Src/A69WD/UI/frmDownloader.cs
T
CSiCoAlm 27795c5620 Importazione dei racconti dai file in una cartella
- Testata procedura e sembra corretta, ma diagnostica non corretta
- Manca navigazione per selezione della cartella.

ToDo:
- Aggiungere gestione parallela della FIFO secondo vecchi modello per aumentare il feedback alla UI
- Inserire anche l'estrazione dei racconti
- Per ora metto tutto il DB in memoria, poi dovrò ottimizzare come su ATDB
2025-12-27 18:34:09 +01:00

190 lines
8.0 KiB
C#

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.Net;
using static System.Windows.Forms.LinkLabel;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using A69WD.Site;
using A69WD.Net;
using System.Collections.Concurrent;
using System.Xml.Linq;
using A69WD.Service;
using A69WD.Data;
namespace A69WD {
public partial class frmDownloader : Form {
// Coda thread-safe di URL da scaricare
private readonly BlockingCollection<iLink> _urlQueue = new BlockingCollection<iLink>(new ConcurrentQueue<iLink>());
// Semaforo per limitare il numero massimo di download simultanei
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
public frmDownloader() {
InitializeComponent();
this.Text = String.Format("A69WD - Dowloader Testi Vrs {0}", cTools.AssemblyVersion);
//engine = new cA69Engine();
//engine.Updating += Engine_Updating;
}
//cA69Engine engine = null;
/// <summary>
/// Metodo per scansionare i link da un file di testo ed inserirli come da downloadare se non ci sono già
/// </summary>
private void btnImportLinks_Click(object sender, EventArgs e) {
//// Chiedo il file di testo da caricare
//lblST.Text = " ";
//this.openFileDialog1.InitialDirectory = Cfg.Settings.PathApplicationRoot;
//if (this.openFileDialog1.ShowDialog() == DialogResult.OK) {
// lblST.Text = string.Format("Importati {0} link", engine.ImportLinkFromFile(openFileDialog1.FileNames[0]));
//}
}
private async void btnDownloadAll_Click(object sender, EventArgs e) {
btnDownloadAll.Enabled = false;
// - Creo istanza del client per il sito con autenticazione:
lblST.Text = DateTime.Now.ToString() + " - Login";
A69WD.Site.iSiteType siteA69 = new cSite_A69();
// - Eseguo l'autenticazione
bool res = await siteA69.Authenticate();
if (res) {
lblST.Text = DateTime.Now.ToString() + " - sito loggato: " + res.ToString();
Logger.Information("Sito correttamente loggato.");
} else {
Logger.Information("Errore di autenticazione al sito.");
return;
}
// - Verifico path per il download
if (!System.IO.Directory.Exists(Cfg.Settings.PathDownloadWorking)) System.IO.Directory.CreateDirectory(Cfg.Settings.PathDownloadWorking);
// // Test downloadando tutti i 10 primi link per categoria
// List<iLink> links = cLink_A69.GetStartLink();
// int i = 1;
// foreach (iLink link in links) {
// lblST.Text = "Start url " + link.FileName;
// Logger.Information("Start url " + link.FileName);
// await siteA69.CrawlPageAsync(link);
// Logger.Information(" end url " + link.FileName);
// i++;
// }
// // Inserisco i link iniziali sulla coda dei download:
// if (!cLink_A69.InsertStartLink(_urlQueue)) {
// lblST.Text = "Inserimento A69 start link fault.";
// return;
// }
// lblST.Text = "In coda vi sono: " + _urlQueue.Count.ToString() + " url.";
//
// // Test estrazione link dal primo indice:
// iLink link = new cLink_A69("https://www.annunci69.it/racconti-erotici/racconti_lista.php?genere=altro&pagina=1", "Idx_altro_1.html");
// Logger.Information("Start url " + link.FileName);
// List<iLink> urls = await siteA69.CrawlPageAsync(link);
// Logger.Information(" end url " + link.FileName + " - URL trovati: " + urls.Count.ToString("000"));
// foreach (iLink url in urls) { _urlQueue.Add(url); }
// lblST.Text = "In coda vi sono: " + _urlQueue.Count.ToString() + " url.";
// Preparo il servizio
serviceCrawler = new Service_Crawler(lblST, pbST);
// Inserisco i link iniziali nella coda
if (!cLink_A69.InsertStartLink(serviceCrawler)) {
lblST.Text = "Inserimento A69 start link fault.";
return;
}
// avvio il servizio
serviceCrawler.StartWorker(siteA69);
}
private Service_Crawler serviceCrawler = null;
private void btnShowLog_Click(object sender, EventArgs e) {
cTools.ShowOnNotepad(Cfg.Settings.PathFileLogs);
}
private void btnHide_Click(object sender, EventArgs e) {
if (MessageBox.Show("Metodo ancora da terminare, la finestra non sarà più visibile, killare il processo", "ATTENZIONE", MessageBoxButtons.OKCancel) == DialogResult.OK){
this.Hide();
}
}
private void btnClose_Click(object sender, EventArgs e) {
//if (engine.Stop()) this.Close();
// fermo i servizi
if (serviceCrawler != null) serviceCrawler.StopWorker();
if (serviceImporter != null) serviceImporter.StopWorker();
this.Close();
}
#region Gestione eventi dal engine
//
// private void Engine_Updating(object sender, EngineEventArgs e) { EngineUpdatingStatus(e.Message, e.NTot, e.NtoDown, e.NDown); }
//
// delegate void EngineUpdatingStatusCallback(string Message, int NTot, int NtoDown, int NDown);
// private void EngineUpdatingStatus(string Message, int NTot, int NtoDown, int NDown) {
// try {
// // InvokeRequired required compares the thread ID of the
// // calling thread to the thread ID of the creating thread.
// // If these threads are different, it returns true.
// if (lblST.InvokeRequired) {
// EngineUpdatingStatusCallback callBack = new EngineUpdatingStatusCallback(EngineUpdatingStatus);
// this.Invoke(callBack, new object[] { Message, NTot, NtoDown, NDown });
// } else {
// lblST.Text = string.Format("{4} - {3} | {2} | {1} - {0}", Message, NTot, NtoDown, NDown, DateTime.Now.ToString("HH:mm:ss"));
// Logger.Information(lblST.Text);
// }
// } catch (Exception ex) {
// Logger.Log(new object[] { "Error Code: ER05553", "Errore in EngineUpdatingStatus():", ex });
// }
// }
//
#endregion
private void btnImport_Click(object sender, EventArgs e) {
// string fp = "C:\\Commesse\\_zPrivate\\A69WD\\Test\\Down\\__A69_altro_Collarini-e-fantasie_166756.html";
// cLink_A69 lk = new cLink_A69("Tmp", "tmp");
// cRac rac = await lk.EstraiRac(fp);
// if (rac != null) {
// //foreach (string tag in rac.Tags) {
// for (int i = 0; i<rac.Tags.Count; i++) {
// Console.WriteLine(rac.Tags[i]);
// }
// // Racconto estratto correttamente, lo salvo sul DB
// App.DB.ImportRac(rac);
// }
// Preparo il servizio
serviceImporter = new Service_Importer(lblST, pbST);
// Per ora uso la directory di default, poi metteremo selezione
string path = Cfg.Settings.PathDownloadWorking;
// avvio il servizio
serviceImporter.StartWorker(path);
}
private Service_Importer serviceImporter = null;
}//class frmDownloader
}//namespace A69WD