diff --git a/Src/A69WD/A69WD.csproj b/Src/A69WD/A69WD.csproj index a012960..6593ba5 100644 --- a/Src/A69WD/A69WD.csproj +++ b/Src/A69WD/A69WD.csproj @@ -74,6 +74,7 @@ + Form diff --git a/Src/A69WD/Data/DBTools.cs b/Src/A69WD/Data/DBTools.cs index 3a2f511..2d2371a 100644 --- a/Src/A69WD/Data/DBTools.cs +++ b/Src/A69WD/Data/DBTools.cs @@ -1947,7 +1947,7 @@ namespace A69WD { #region Reader function: GetReport, GetRandomIDrac - private long GetNumRacs(string TagFilter = "") { + public long GetNumRacs(string TagFilter = "") { string query = "SELECT count (IDrac) FROM Racconti"; if (TagFilter != "") { query = "SELECT count (Racconti.IDrac) AS NUM FROM Racconti, Links_Rac_Vot, Voti WHERE Racconti.IDrac=Links_Rac_Vot.IDrac AND Links_Rac_Vot.IDvot=Voti.IDvot AND Voti.Voto='" + TagFilter + "'"; } return Helper.ExecuteScalar(cn,query,objLock); diff --git a/Src/A69WD/Data/cNota.cs b/Src/A69WD/Data/cNota.cs index 566db36..62be4c6 100644 --- a/Src/A69WD/Data/cNota.cs +++ b/Src/A69WD/Data/cNota.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Serialization; namespace A69WD.Data { @@ -11,7 +12,10 @@ namespace A69WD.Data { /// public class cNota { + [XmlAttribute] public string Key { get; set; } + + [XmlAttribute] public string Description { get; set; } /// diff --git a/Src/A69WD/Data/cRac.cs b/Src/A69WD/Data/cRac.cs index c4b0c9e..cedd073 100644 --- a/Src/A69WD/Data/cRac.cs +++ b/Src/A69WD/Data/cRac.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Serialization; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace A69WD.Data { @@ -83,6 +84,8 @@ namespace A69WD.Data { /// Default: null /// Mappa la relazione tramite [Links_Rac_Aut] con la tabella [Autori]. /// + [XmlArray("Autori")] + [XmlArrayItem("Autore")] public List Autori { get; set; } = new List(); /// @@ -90,6 +93,8 @@ namespace A69WD.Data { /// Default: null /// Mappa la relazione tramite [Links_Rac_Tag] con la tabella [Tags]. /// + [XmlArray("Tags")] + [XmlArrayItem("Tag")] public List Tags { get; set; } = new List(); /// @@ -97,6 +102,8 @@ namespace A69WD.Data { /// Default: null /// Mappa la relazione tramite [Links_Rac_Ori] con la tabella [Origini]. /// + [XmlArray("Origini")] + [XmlArrayItem("Origine")] public List Origini { get; set; } = new List(); /// @@ -108,6 +115,8 @@ namespace A69WD.Data { /// Mappa la relazione tramite [Links_Rac_Not] con la tabella [Notes]. /// //public Dictionary Note { get; set; } = new Dictionary(); + [XmlArray("Notes")] + [XmlArrayItem("Nota")] public List Notes { get; set; } = new List(); #endregion @@ -235,11 +244,11 @@ namespace A69WD.Data { } } catch (Exception ex) { Logger.Log(new object[] { "Error Code:val001", "Errore in ATWD.Rac.Validate", ex }); } - try { - //if (!isValid) { - // Logger.Warning("NOT VALIDATE: " + strIDrac + " - " + fullTitle); - //} - } catch (Exception ex) { Logger.Error(string.Format("Error Code: {0} - Errore in {1}.{2}: {3}", "ER375278", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodInfo.GetCurrentMethod().Name, ex.Message)); } + //try { + // //if (!isValid) { + // // Logger.Warning("NOT VALIDATE: " + strIDrac + " - " + fullTitle); + // //} + //} catch (Exception ex) { Logger.Error(string.Format("Error Code: {0} - Errore in {1}.{2}: {3}", "ER375278", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodInfo.GetCurrentMethod().Name, ex.Message)); } return isValid; } @@ -278,7 +287,49 @@ namespace A69WD.Data { #endregion + #region Serializzazione su file XML + /// + /// Serializza l'oggetto cRac in xml + /// + /// Testo xml che serializza il cRac + public string ToXml() { + XmlSerializer serializer = new XmlSerializer(typeof(cRac)); + StringWriter sw = new StringWriter(); + serializer.Serialize(sw, this); + return sw.ToString(); + } + + /// + /// Deserializza l'oggetto cRac dal formato xml + /// + /// Testo xml che serializza il cRac + /// cRac che rappresenta il racconto ricavato dal testo xml + public static cRac FromXml(string xml) { + XmlSerializer serializer = new XmlSerializer(typeof(cRac)); + StringReader sr = new StringReader(xml); + return (cRac)serializer.Deserialize(sr); + } + + /// + /// Salva il cRac come file xml + /// + /// Path dove salvare + public void SaveToXmlFile(string path) { + File.WriteAllText(path, ToXml()); + } + + /// + /// Carica il cRac dal file XML indicato + /// + /// Path da dove caricare + /// cRac che rappresenta il racconto ricavato dal file xml + public static cRac LoadFromXmlFile(string path) { + string xml = File.ReadAllText(path); + return FromXml(xml); + } + + #endregion /// /// Crea il file html che rappresenta il racconto. diff --git a/Src/A69WD/Properties/AssemblyInfo.cs b/Src/A69WD/Properties/AssemblyInfo.cs index 3a476fb..c808a66 100644 --- a/Src/A69WD/Properties/AssemblyInfo.cs +++ b/Src/A69WD/Properties/AssemblyInfo.cs @@ -32,8 +32,24 @@ using System.Runtime.InteropServices; // È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build // usando l'asterisco '*' come illustrato di seguito: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.5.3.0")] -[assembly: AssemblyFileVersion("0.5.3.0")] +[assembly: AssemblyVersion("0.5.3.1")] +[assembly: AssemblyFileVersion("0.5.3.1")] + + +/* + * + * Vrs 0.5.3.1 + * + * Compilata da CSiCoAlm il 2026/01/04 + * Inserito importazione dei file del vecchio sito Milu che sono completamente non compatibili con i formati attuali. + * + * + * ToDo: + * - Aggiungere gestione parallela della FIFO secondo vecchi modello per aumentare il feedback alla UI + * - Inserire anche l'estrazione dei racconti + * - Inserire funzionalità avanzate sul lettore + * + */ /* diff --git a/Src/A69WD/Service/Service_Import_Milu.cs b/Src/A69WD/Service/Service_Import_Milu.cs new file mode 100644 index 0000000..865d6b6 --- /dev/null +++ b/Src/A69WD/Service/Service_Import_Milu.cs @@ -0,0 +1,622 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using A69WD.Data; +using A69WD.Net; +using HtmlAgilityPack; + + + +namespace A69WD.Service { + + + public class Service_Import_Milu { + + // Thread worker che consuma la coda + private Thread _workerThread; + private readonly StatusStrip _sb; + private string _path; + // Contatori + private int _totali = 0; + private int _completati = 0; + private int _duplicati = 0; + private int _errori = 0; + + public Service_Import_Milu(StatusStrip sb) { + _sb = sb; + } + + public void StartWorker(string path) { + _path = path; + _workerThread = new Thread(ProcessWorking) { IsBackground = true }; + _workerThread.Start(); + } + + public void StopWorker() { + ; + } + + + + private async void ProcessWorking() { + // Seleziono 1000 file in modo casuale dalla directory indicata: + // - Ottieni tutti i file nel percorso + string[] files = System.IO.Directory.GetFiles(Cfg.Settings.PathImport, "*chapter=all"); + int MaxNFile = files.Length < Cfg.Settings.MaxNumFile ? files.Length : Cfg.Settings.MaxNumFile; + // - Mescola l'elenco dei file in modo casuale e seleziona i primi MaxNFile + // Usiamo LINQ per mescolare (Shuffle) l'array e prendere i primi MaxNFile + // Si noti che mescolare casualmente l'intero array può essere costoso per molte migliaia di file. + // Alternativamente, si può usare un algoritmo di campionamento casuale (come Fisher-Yates) se l'efficienza è cruciale, + // ma per 10 elementi da un elenco ragionevole, questo è semplice ed efficace. + Random rng = new Random(); + var fileCasuali = files + .OrderBy(f => rng.Next()) // Ordina in base a un numero casuale + .Take(MaxNFile) // Prendi i primi MaxNFile + .ToList(); // Converti in List (opzionale, ma utile) + + // aggiorno contatori + _totali = fileCasuali.Count; + _completati = 0; + _duplicati = 0; + _errori = 0; + UpdateCounters(); + + // Verifico cartelle di destinazione + string pathExport = System.IO.Path.Combine(Cfg.Settings.PathApplicationRoot, "Export"); + if (!Directory.Exists(pathExport)) Directory.CreateDirectory(pathExport); + if (!Directory.Exists(Cfg.Settings.PathSrcDone)) Directory.CreateDirectory(Cfg.Settings.PathSrcDone); + if (!Directory.Exists(Cfg.Settings.PathSrcErrOnExtract)) Directory.CreateDirectory(Cfg.Settings.PathSrcErrOnExtract); + if (!Directory.Exists(Cfg.Settings.PathSrcErrOnSave)) Directory.CreateDirectory(Cfg.Settings.PathSrcErrOnSave); + + // Ciclo su ciascun file + foreach (string file in fileCasuali) { + string name = System.IO.Path.GetFileName(file); + Logger.Warning($"Import - Start estrazione racconto: {name}"); + + List racs = await EstraiRacs(file); + if (racs != null) { + bool saveErr = false; + foreach (cRac rac in racs) { + if (rac.Validate()) { + // racconto valido: + // // - lo esporto come xml + // string nam = $"Milu_Rac_{rac.strIDrac}.xml"; + // rac.SaveToXmlFile(System.IO.Path.Combine(pathExport, nam)); + // - lo salvo sul DB + int res = App.DB.ImportRac(rac); // res=id del racconto nel DB + if (res < 1) { + // errore nel salvataggio + saveErr = true; + break; + } else { + // salvataggio ok + //saveErr = false; + } + } else { + Logger.Warning($"Import - estrazione errata: {name}"); + saveErr = true; + break; + } + } + if (saveErr) { + // errore nel salvataggio dei racconti estratti dal file + Logger.Warning($"Import - errore nel salvataggio: {name}"); + Interlocked.Increment(ref _errori); + // - Sposto il file + System.IO.File.Move(file, System.IO.Path.Combine(Cfg.Settings.PathSrcErrOnSave, System.IO.Path.GetFileName(file))); + } else { + // salvataggio ok + Logger.Warning($"Import - racconti salvati: {name}"); + Interlocked.Increment(ref _completati); + // - Sposto il file + System.IO.File.Move(file, System.IO.Path.Combine(Cfg.Settings.PathSrcDone, System.IO.Path.GetFileName(file))); + } + } else { + Logger.Warning($"Import - estrazione errata: {name}"); + Interlocked.Increment(ref _errori); + // - Sposto il file + System.IO.File.Move(file, System.IO.Path.Combine(Cfg.Settings.PathSrcErrOnExtract, System.IO.Path.GetFileName(file))); + } + UpdateCounters(); + } + UpdateCounters(); + } + + private void UpdateCounters() { + if (_sb.InvokeRequired) { + _sb.Invoke(new Action(UpdateCounters)); + return; + } + + int daFare = _totali - _completati - _errori; + + _sb.Items["sbStatusLabel"].Text = $"{_totali}|{_completati}|{_errori}"; + _sb.Items["sbStatusLabel"].ToolTipText = "Totali | Completati | Error"; + + (_sb.Items["sbProgressBar"] as ToolStripProgressBar).Maximum = _totali > 0 ? _totali : 1; + (_sb.Items["sbProgressBar"] as ToolStripProgressBar).Value = _completati + _errori; + } + + + + public async Task> EstraiRacs(string FileFullPath) { + /* + * Analisi file dei racconti Milu con il vecchio formato: + * + * - I file con un racconto valido hanno la seguente struttura: + * + * {...} + *
+ * {Titolo} + * by + * {Autor} + *
+ *
+ *
+ * Summary: {Riassunto}
+ * Categories: + * {categoria} + * Characters: {Characters}
+ * Genres: {Genres}
+ * Warnings: {Warnings}
+ * Challenges: {Challenges}
+ * Series: {Series}
+ * Chapters: {Chapters} + * Completed: {Completed} + * Word count: {WordCount} + * Read: {Read} + * Published: {Published} + * Updated: }Updated} + *
+ *
+ *

1. {Tit1} by {Autor}

+ *

2. {Tit2} by {Autor}

+ *

3. {Tit3} by {Autor}

+ *
{Tit1} by {Autor}
+ *
{Trama1}
+ * + *
{Tit2} by {Autor}
+ *
{Trama2}
+ * + *
{Tit3} by {Autor}
+ *
{Trama3}
+ * + * {...} + *
Questo racconto è attualmente archiviato su {URLrac}
+ * + * Quindi per ricavare i dati del racconto: + * - Ricavo tag pagetitle + * - Se pagetitle vuoto o size<=2kb racconto nullo, inserisco log e proseguo + * - Se pagetitle non nullo allora ho un racconto valido e proseguo l'estrazione. + * - Da pagetitle ricavo il titolo del racconto. + * - dal testo del tag infobox.content ricavo filtrando i vari parametri del racconto + * - Dall'elenco dei tag chaptertitle ricavo i sottotitoli dei singoli racconti ATDB + * - Dall'elenco dei tag chapter ricavo le trame dei singoli racconti. + * - Occorre verificare per bene che l'ordine venga rispettato in modo da ordinarli correttamente. + * - Infine dal tag archivedat.a ricavo l'URL del racconto per verifica che sia come il link. + * - Ricavati tutti i dati inserisco sul DB tutti i singoli capitoli come singoli racconti ATDB assegnando le parti comuni a tutti i racconti. + * + * + */ + cRac rac = new cRac(); + List racs = new List(); + HtmlNodeCollection nodes; + try { + Console.WriteLine($"Old Milu - Importo: {FileFullPath}"); + + string filePathName = System.IO.Path.GetFileName(FileFullPath); + + // Ricavo il nodo radice del racconto: + HtmlAgilityPack.HtmlDocument tdoc = new HtmlAgilityPack.HtmlDocument(); + tdoc.Load(FileFullPath); + HtmlNode root = tdoc.DocumentNode; + if (root == null) { + // racconto non presente + return null; + } + + + List origini = null; + List tags = null; + string titolo = string.Empty; + string autore = string.Empty; + DateTime creato = DateTime.Now; + #region Info comuni a tutti i capitoli del racconto: + + #region Origine + // Origine fissa: + origini = new List { "Old Milu" }; + #endregion + + #region Titolo & Autore + // Titolo e autore si ricavano assieme: + try { + nodes = root.SelectNodes("//div[@id='pagetitle']//a[@href]"); + foreach (HtmlNode nd in nodes) { + string href = nd.Attributes["href"].Value; + if (href.StartsWith("viewstory.php?sid=")) { + titolo = cTools.FormattaTesto(nd.InnerText.Trim(), false); + } else { + if (href.StartsWith("viewuser.php?uid=")) { + autore = cTools.FormattaTesto(nd.InnerText.Trim(), false); + } + } + } + if (string.IsNullOrEmpty(titolo)) { + Logger.Error($"Old Milu - Import - No Title - {filePathName}"); + return null; + } else { + if (string.IsNullOrEmpty(autore)) { + Logger.Error($"Old Milu - Import - No Autor - {filePathName}"); + return null; + } + } + } catch (Exception ex) { Logger.Error(string.Format("Fallita estrazione titolo/autore dal file {0}\r\n{1}", filePathName, ex.Message)); return null; } + #endregion + + #region Tags: --> Testo dei nodi
< div class="content">{categoria} + try { + nodes = root.SelectNodes("//div[@class='infobox']//div[@class='content']//a"); + List items = new List(); + foreach (HtmlNode nd in nodes) { + string href = nd.Attributes["href"].Value; + if (href.StartsWith("browse.php?type=categories")) { + items.Add(cTools.FormattaTesto(nd.InnerText.Replace("genere", "").Trim(), false)); + } + } + //items.Sort(); + items = items + .OrderBy(s => s) // ordina alfabeticamente + .Distinct() // elimina duplicati + .ToList(); + tags = items; + if (tags.Count<1) { + Logger.Error($"Old Milu - Import - No Tags - {filePathName}"); + return null; + } + } catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione Tags dal file {0}\r\n{1}", filePathName, ex.Message)); return null; } + #endregion + + #region Creato + // Data estreatta dal testo del nodo
< div class="content"> fra "Published{Published}Updated: + try { + nodes = root.SelectNodes("//div[@class='infobox']//div[@class='content']"); + foreach (HtmlNode nd in nodes) { + string txt = nd.InnerText.Trim().Replace(" ", ""); + int start = txt.LastIndexOf(" Published: "); + int stop = txt.LastIndexOf(" Updated: "); + string strData = txt.Substring(start + 11, stop - start - 11); + CultureInfo culture = CultureInfo.CreateSpecificCulture("it-IT"); + DateTimeStyles styles = DateTimeStyles.None; + DateTime tmpDT = DateTime.Now; + if (!DateTime.TryParse(strData.Trim(), culture, styles, out creato)) { + Logger.Error($"Old Milu - Import - No data - {filePathName}"); + } + } + } catch (Exception ex) { Logger.Warning(string.Format("Data non riconosciuta nel file {0}\r\n{1}", filePathName, ex.Message)); return null; } + #endregion + + // I vari capitoli dei racconti sono descritti dai nodi
e
in successione. + try { + HtmlNodeCollection capTitles = root.SelectNodes("//div[@class='chaptertitle']"); + HtmlNodeCollection capText = root.SelectNodes("//div[@class='chapter']"); + if ((capTitles.Count > 0) && (capTitles.Count == capText.Count)) { + // Trovato capitoli congruenti + for (int i = 0; i < capTitles.Count; i++) { + // Creo i racconti: + rac = new cRac(); + rac.Title = titolo; + rac.SubTitle = capTitles[i].InnerText.Trim().Replace($"by {autore}","").Trim(); + rac.Creato = creato; + rac.Updated = DateTime.Now; + //rac.Trama = cTools.FormattaTesto(capText[i].InnerHtml.Trim(), false); + rac.Trama = cTools.FormattaTesto(capText[i].InnerHtml.Trim(), true); + rac.Voto = "Non Letto"; + rac.Autori = new List(); + rac.Autori.Add(autore); + rac.Tags = tags; + rac.Origini = origini; + rac.Notes = new List(); + rac.Notes.Add(new Data.cNota("SrcFile", System.IO.Path.GetFileName(filePathName))); + // Inserisco il racconto nella collezione + if (rac.Validate()) { racs.Add(rac); } + } + } else { + // Capitoli non trovati o non congruenti + Logger.Error($"Old Milu - Import - No Capitoli - {filePathName}"); + return null; + } + } catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione capitolo {0}\r\n{1}", filePathName, ex.Message)); return null; } + #endregion + + Logger.Information($"Terminato estrazione racconti dal file: {filePathName}"); + + } catch (Exception ex) { + Logger.Error($"Old Milu - Import Error - {FileFullPath}: {ex.Message}"); + Console.WriteLine($"Old Milu - Import Error - {FileFullPath}: {ex.Message}"); + return null; + } + return racs; + } + + + protected virtual void Format_Insert_Tags(Data.cRac rac, List items) { + // Per ora riporto tutti i tag rilevati, mentre in futuro dovrò: + // - parsare la lista e formattare correttamente i tag + // - ordinare la lista dei tag formattati ed eliminare i duplicati + // - se non sono rimasti tag, inserisco il tag generale per indicare che non vi sono tag + // - altrimenti inserisco tutti i tag rimasti. + rac.Tags = new List(); + try { + items.Sort(); + string tmp = ""; + foreach (string item in items) { + string it = item.Trim().ToLower(); + if (tmp != it) { + #region switch per formattare il testo + switch (it) { + //case "racconti 69": + // rac.Tags.Add("69"); + // break; + //case "abusi": + // rac.Tags.Add("Abusi"); + // break; + //case "camgirl": + //case "chat e siti di incontri…": + //case "fiche": + // rac.Tags.Add("Altro"); + // break; + //case "amatoriali": + // rac.Tags.Add("Amatoriali"); + // break; + //case "anale": + // rac.Tags.Add("Anale"); + // break; + //case "audio libri erotici": + //case "audio racconti erotici": + // rac.Tags.Add("Audio"); + // break; + //case "bdsm": + // rac.Tags.Add("BDMS"); + // break; + //case "bisex": + //case "bisex ♀": + //case "bisex ♂": + // rac.Tags.Add("Bisex"); + // break; + //case "bondage": + // rac.Tags.Add("Bondage"); + // break; + //case "bondage e sadomaso": + // rac.Tags.Add("Bondage"); + // rac.Tags.Add("Sadomaso"); + // break; + //case "bukkake": + // rac.Tags.Add("Bukkake"); + // break; + //case "comici": + //case "comunità": + // rac.Tags.Add("Comico"); + // break; + //case "concorso estate 2019": + //case "concorso natale 2018": + //case "decameron 2020": + // rac.Tags.Add("Concorso"); + // break; + //case "confessioni": + // rac.Tags.Add("Confessioni"); + // break; + //case "coppie": + //case "scambio di coppia": + //case "scambio di coppie": + // rac.Tags.Add("Coppie"); + // break; + //case "cuckold": + //case "racconti cuckold": + // rac.Tags.Add("Cuckold"); + // break; + //case "curiosità": + //case "curiosità sul sesso": + // rac.Tags.Add("Curiosità"); + // break; + //case "dominazione": + //case "racconti di dominazione": + //case "schiavi&padroni": + // rac.Tags.Add("Dominazione"); + // break; + //case "doppia penetrazione": + // rac.Tags.Add("Doppia Penetrazione"); + // break; + //case "esibizionismo": + // rac.Tags.Add("Esibizionismo"); + // break; + //case "etero": + //case "lui & lei": + //case "racconti erotici etero": + // rac.Tags.Add("Etero"); + // break; + //case "feticismo": + // rac.Tags.Add("Feticismo"); + // break; + //case "fisting": + // rac.Tags.Add("Fisting"); + // break; + //case "gang bang": + // rac.Tags.Add("Gang Bang"); + // break; + //case "gay": + //case "racconti gay": + // rac.Tags.Add("Gay"); + // break; + //case "gay & bisex": + //case "gay e bisex": + // rac.Tags.Add("Gay"); + // rac.Tags.Add("Bisex"); + // break; + //case "gay - travestiti": + // rac.Tags.Add("Gay"); + // rac.Tags.Add("Trans"); + // break; + //case "incesti": + //case "incesto": + //case "racconti erotici sull'incesto": + // rac.Tags.Add("Incesto"); + // break; + //case "interviste": + //case "interviste erotiche": + // rac.Tags.Add("Intervista"); + // break; + //case "lesbo": + //case "racconti erotici lesbo": + //case "saffico": + // rac.Tags.Add("Lesbo"); + // break; + //case "autoerotismo": + //case "masturbazione": + //case "masturbazioni": + //case "racconti sull'autoerotismo": + // rac.Tags.Add("Masturbazione"); + // break; + //case "milf": + // rac.Tags.Add("MILF"); + // break; + //case "nudismo": + // rac.Tags.Add("Nudismo"); + // break; + //case "orge": + //case "orgia": + //case "sesso di gruppo": + // rac.Tags.Add("Orge"); + // break; + //case "pissing": + // rac.Tags.Add("Pissing"); + // break; + //case "lirica erotica": + //case "poesia erotica": + //case "poesie": + //case "poesie erotiche": + // rac.Tags.Add("Poesia"); + // break; + //case "pompini": + // rac.Tags.Add("Pompini"); + // break; + //case "giochi erotici": + //case "prime esperienze": + //case "prime volte": + // rac.Tags.Add("Prime Esperienze"); + // break; + //case "pulp": + // rac.Tags.Add("Pulp"); + // break; + //case "sadomaso": + // rac.Tags.Add("Sadomaso"); + // break; + //case "sensazioni": + //case "sentimentali": + // rac.Tags.Add("Sentimentali"); + // break; + //case "cornuti": + //case "tradimenti": + //case "tradimento": + // rac.Tags.Add("Tradimento"); + // break; + //case "racconti con trans": + //case "racconti trans": + //case "trans": + //case "trans e travestiti": + // rac.Tags.Add("Trans"); + // break; + //case "trasgressivo": + // rac.Tags.Add("Trasgressivo"); + // break; + //case "trio": + // rac.Tags.Add("Trio"); + // break; + //case "uncategorized": + // rac.Tags.Add("Uncategorized"); + // break; + //case "voyeur": + //case "voyeurismo": + // rac.Tags.Add("Voyeur"); + // break; + //case "animali": + //case "zoofilia": + // rac.Tags.Add("Zoofilia"); + // break; + + //case "Gay": + // rac.Tags.Add("Gay"); + // break; + //case "Racconti bisex": + // rac.Tags.Add("Bisex"); + // break; + //case "Racconti etero": + // rac.Tags.Add("Etero"); + // break; + //case "Racconti fetish": + // rac.Tags.Add("Feticismo"); + // break; + //case "Racconti incesto": + // rac.Tags.Add("Incesto"); + // break; + //case "Racconti lesbo": + // rac.Tags.Add("Lesbo"); + // break; + //case "Racconti masturbazione": + // rac.Tags.Add("Masturbazione"); + // break; + //case "Racconti mature": + // rac.Tags.Add("Mature"); + // break; + //case "Racconti orge": + // rac.Tags.Add("Orge"); + // break; + //case "Racconti prima volta": + // rac.Tags.Add("Prime Esperienze"); + // break; + //case "Racconti ricatto": + // rac.Tags.Add("Ricatto"); + // break; + //case "Racconti scambio di coppia": + // rac.Tags.Add("Coppie"); + // break; + //case "Racconti sottomissione": + // rac.Tags.Add("Dominazione"); + // break; + //case "Racconti tradimenti": + // rac.Tags.Add("Tradimento"); + // break; + //case "Racconti trav": + //case "Trans": + // rac.Tags.Add("Trans"); + // break; + + default: + rac.Tags.Add(item); + break; + } + #endregion + tmp = it; + + }//if + + }//foreach + + } catch (Exception ex) { + Logger.Error(string.Format("Error Code: {0} - Errore in {1}.{2}: {3}", "ER00040", System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodInfo.GetCurrentMethod().Name, ex.Message)); + } finally { + if (rac.Tags.Count == 0) rac.Tags.Add("_None_"); + } + }//function + + + }//class Service_Import_Milu + +}//namespace A69WD.Service diff --git a/Src/A69WD/Settings.cfg b/Src/A69WD/Settings.cfg index ee6f83d..ee1308e 100644 --- a/Src/A69WD/Settings.cfg +++ b/Src/A69WD/Settings.cfg @@ -10,7 +10,7 @@ C:\Commesse\_zPrivate\A69WD\Test\Import - 1000 + 5 A69DB.db diff --git a/Src/A69WD/UI/frmReader.Designer.cs b/Src/A69WD/UI/frmReader.Designer.cs index 346d918..744b564 100644 --- a/Src/A69WD/UI/frmReader.Designer.cs +++ b/Src/A69WD/UI/frmReader.Designer.cs @@ -30,6 +30,10 @@ this.sbStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.btnTest1 = new System.Windows.Forms.Button(); this.pnlTop = new System.Windows.Forms.Panel(); + this.btnTest2 = new System.Windows.Forms.Button(); + this.btnTest4 = new System.Windows.Forms.Button(); + this.btnTest3 = new System.Windows.Forms.Button(); + this.btnTest5 = new System.Windows.Forms.Button(); this.sb.SuspendLayout(); this.pnlTop.SuspendLayout(); this.SuspendLayout(); @@ -97,14 +101,18 @@ // this.btnTest1.Location = new System.Drawing.Point(11, 5); this.btnTest1.Name = "btnTest1"; - this.btnTest1.Size = new System.Drawing.Size(62, 32); + this.btnTest1.Size = new System.Drawing.Size(99, 32); this.btnTest1.TabIndex = 4; - this.btnTest1.Text = "Test"; + this.btnTest1.Text = "Serializza"; this.btnTest1.UseVisualStyleBackColor = true; this.btnTest1.Click += new System.EventHandler(this.btnTest1_Click); // // pnlTop // + this.pnlTop.Controls.Add(this.btnTest5); + this.pnlTop.Controls.Add(this.btnTest4); + this.pnlTop.Controls.Add(this.btnTest3); + this.pnlTop.Controls.Add(this.btnTest2); this.pnlTop.Controls.Add(this.btnTest1); this.pnlTop.Dock = System.Windows.Forms.DockStyle.Top; this.pnlTop.Location = new System.Drawing.Point(0, 0); @@ -112,6 +120,46 @@ this.pnlTop.Size = new System.Drawing.Size(700, 42); this.pnlTop.TabIndex = 0; // + // btnTest2 + // + this.btnTest2.Location = new System.Drawing.Point(113, 5); + this.btnTest2.Name = "btnTest2"; + this.btnTest2.Size = new System.Drawing.Size(99, 32); + this.btnTest2.TabIndex = 5; + this.btnTest2.Text = "Deserializza"; + this.btnTest2.UseVisualStyleBackColor = true; + this.btnTest2.Click += new System.EventHandler(this.btnTest2_Click); + // + // btnTest4 + // + this.btnTest4.Location = new System.Drawing.Point(337, 5); + this.btnTest4.Name = "btnTest4"; + this.btnTest4.Size = new System.Drawing.Size(99, 32); + this.btnTest4.TabIndex = 7; + this.btnTest4.Text = "Deserializza ALL"; + this.btnTest4.UseVisualStyleBackColor = true; + this.btnTest4.Click += new System.EventHandler(this.btnTest4_Click); + // + // btnTest3 + // + this.btnTest3.Location = new System.Drawing.Point(235, 5); + this.btnTest3.Name = "btnTest3"; + this.btnTest3.Size = new System.Drawing.Size(99, 32); + this.btnTest3.TabIndex = 6; + this.btnTest3.Text = "Serializza ALL"; + this.btnTest3.UseVisualStyleBackColor = true; + this.btnTest3.Click += new System.EventHandler(this.btnTest3_Click); + // + // btnTest5 + // + this.btnTest5.Location = new System.Drawing.Point(459, 5); + this.btnTest5.Name = "btnTest5"; + this.btnTest5.Size = new System.Drawing.Size(99, 32); + this.btnTest5.TabIndex = 9; + this.btnTest5.Text = "Import Milu"; + this.btnTest5.UseVisualStyleBackColor = true; + this.btnTest5.Click += new System.EventHandler(this.btnTest5_Click); + // // frmReader // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -141,5 +189,9 @@ private System.Windows.Forms.ToolStripStatusLabel sbStatusLabel; private System.Windows.Forms.Button btnTest1; private System.Windows.Forms.Panel pnlTop; + private System.Windows.Forms.Button btnTest2; + private System.Windows.Forms.Button btnTest4; + private System.Windows.Forms.Button btnTest3; + private System.Windows.Forms.Button btnTest5; } } \ No newline at end of file diff --git a/Src/A69WD/UI/frmReader.cs b/Src/A69WD/UI/frmReader.cs index 6a31982..f34bd53 100644 --- a/Src/A69WD/UI/frmReader.cs +++ b/Src/A69WD/UI/frmReader.cs @@ -61,9 +61,9 @@ namespace A69WD.UI { mImpStart.Enabled = true; mImpStop.Enabled = false; - // Update UI - pnlTop.Enabled = false; - pnlTop.Visible = false; + // TEST // Update UI + // TEST pnlTop.Enabled = false; + // TEST pnlTop.Visible = false; } @@ -697,7 +697,6 @@ namespace A69WD.UI { // avvio il servizio serviceCrawler.StartWorker(); } - void MenuItem_Skraping_Stop_Click(object sender, EventArgs e) { // Update menu mSkrStart.Enabled = false; @@ -707,7 +706,6 @@ namespace A69WD.UI { if (serviceCrawler != null) { serviceCrawler.StopWorker(); } } - void MenuItem_Importer_Start_Click(object sender, EventArgs e) { // Update menu mSkrStart.Enabled = false; @@ -719,7 +717,7 @@ namespace A69WD.UI { ServiceImporter = new Service_Importer(sb); // Per ora uso la directory di default, poi metteremo selezione - string path = Cfg.Settings.PathDownloadWorking; + string path = Cfg.Settings.PathImport; // avvio il servizio ServiceImporter.StartWorker(path); @@ -735,35 +733,78 @@ namespace A69WD.UI { if (ServiceImporter != null) { ServiceImporter.StopWorker(); } } - void MenuItem_ShowLog_Click(object sender, EventArgs e) { cTools.ShowOnNotepad(Cfg.Settings.PathFileLogs); } private void btnTest1_Click(object sender, EventArgs e) { - // Test skraping eRac - + // Test serializzazione su file xml // - Verifico path per il download if (!System.IO.Directory.Exists(Cfg.Settings.PathDownloadWorking)) System.IO.Directory.CreateDirectory(Cfg.Settings.PathDownloadWorking); - // Preparo il servizio - serviceCrawler = new Service_Crawler(sb); - // Inserisco i link iniziali nella coda - if (!cLink_eRac.InsertStartLink(serviceCrawler)) { - Logger.Warning("eRac - Insert start link Fault"); - sbStatusLabel.Text = "eRac fault."; - return; + // Serializzo 5 racconti casuali + for (int i = 0; i < 5; i++) { + cRac rac = App.DB.GetRacById(App.DB.GetRandomIDrac()); + string path = System.IO.Path.Combine(Cfg.Settings.PathDownloadWorking, $"ATDB_Rac_{rac.strIDrac}.xml"); + rac.SaveToXmlFile(path); } - //// Inserisco link di un racconto: - //string url = "https://www.eroticiracconti.it/racconto/105286-nicole-gis-il-culto-della-terza-notte"; // "https://www.eroticiracconti.it/racconto/112763-elara-capitolo-2-il-cambiamento"; - //string name = "eRac_112763-elara-capitolo-2-il-cambiamento.html"; - //serviceCrawler.EnqueueUrl(new cLink_eRac(url, name)); + } + + private void btnTest2_Click(object sender, EventArgs e) { + // Test deserializzazione da file xml + + string[] files = System.IO.Directory.GetFiles(Cfg.Settings.PathImport, "ATDB_*.xml"); + foreach (string file in files) { + cRac rac = cRac.LoadFromXmlFile(file); + var res = App.DB.ImportRac(rac); + } + } + + private void btnTest3_Click(object sender, EventArgs e) { + // Test serializzazione su file xml di tutti i racconti: + + // - Verifico path per il download + if (!System.IO.Directory.Exists(Cfg.Settings.PathDownloadWorking)) System.IO.Directory.CreateDirectory(Cfg.Settings.PathDownloadWorking); + + // - Ricavo il numero totale di racconti: + long nRac = App.DB.GetNumRacs(); + + // - Serializzo i racconti + for (long i = 0; i <= nRac; i++) { + cRac rac = App.DB.GetRacById(i); + if (rac == null) continue; + string path = System.IO.Path.Combine(Cfg.Settings.PathDownloadWorking, $"ATDB_Rac_{rac.strIDrac}.xml"); + rac.SaveToXmlFile(path); + } + + } + + private void btnTest4_Click(object sender, EventArgs e) { + // Test deserializzazione da file xml + + string[] files = System.IO.Directory.GetFiles(Cfg.Settings.PathImport, "ATDB_*.xml"); + foreach (string file in files) { + cRac rac = cRac.LoadFromXmlFile(file); + var res = App.DB.ImportRac(rac); + } + } + + private void btnTest5_Click(object sender, EventArgs e) { + // Test importer dal vecchio formato di Milu: + + // - Preparo il servizio + ServiceImportMilu = new Service_Import_Milu(sb); + + // - Per ora uso la directory di default, poi metteremo selezione + string path = Cfg.Settings.PathImport; // avvio il servizio - serviceCrawler.StartWorker(); + ServiceImportMilu.StartWorker(path); } + Service_Import_Milu ServiceImportMilu = null; + }