Compare commits
18
Commits
ab758b77d9
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a6328f3d9 | ||
|
|
c9075fabc8 | ||
|
|
9f32778d0a | ||
|
|
04a27b9b19 | ||
|
|
09606b60ae | ||
|
|
6b7d77d1a4 | ||
|
|
f8685ad65d | ||
|
|
89ca167bcc | ||
|
|
ec65be49d8 | ||
|
|
d09e9cbf39 | ||
|
|
0d2b5a1f49 | ||
|
|
cc828ff4ee | ||
|
|
1c372a3632 | ||
|
|
63e769810f | ||
|
|
dfe56ef6ae | ||
|
|
0ae8fee6a1 | ||
|
|
0ba38dab69 | ||
|
|
b88ba4b8a6 |
No files matched your search
@@ -1 +1 @@
|
|||||||
{"RootPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD","ProjectFileName":"A69WD.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"App.cs"},{"SourceFile":"Data\\cNota.cs"},{"SourceFile":"Data\\cRac.cs"},{"SourceFile":"Data\\DBTools.cs"},{"SourceFile":"Data\\Helper.cs"},{"SourceFile":"General\\Navigator.cs"},{"SourceFile":"Net\\eLinkState.cs"},{"SourceFile":"Net\\cLink_A69.cs"},{"SourceFile":"Service\\Service_Crawler.cs"},{"SourceFile":"Service\\Service_Importer.cs"},{"SourceFile":"Site\\cSite_A69.cs"},{"SourceFile":"UI\\frmDownloader.cs"},{"SourceFile":"UI\\frmDownloader.Designer.cs"},{"SourceFile":"General\\Cfg.cs"},{"SourceFile":"General\\cTools.cs"},{"SourceFile":"General\\Logger.cs"},{"SourceFile":"Net\\iLink.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Site\\iSiteType.cs"},{"SourceFile":"UI\\frmReader.cs"},{"SourceFile":"UI\\frmReader.Designer.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.8.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\HtmlAgilityPack.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\System.Data.SQLite.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Deployment.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD\\bin\\Debug\\A69WD.exe","OutputItemRelativePath":"A69WD.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
|
{"RootPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD","ProjectFileName":"A69WD.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"App.cs"},{"SourceFile":"Data\\cNota.cs"},{"SourceFile":"Data\\cRac.cs"},{"SourceFile":"Data\\DBTools.cs"},{"SourceFile":"Data\\Helper.cs"},{"SourceFile":"General\\Navigator.cs"},{"SourceFile":"Net\\eLinkState.cs"},{"SourceFile":"Net\\cLink_A69.cs"},{"SourceFile":"Service\\Service_Crawler.cs"},{"SourceFile":"Service\\Service_Importer.cs"},{"SourceFile":"General\\Cfg.cs"},{"SourceFile":"General\\cTools.cs"},{"SourceFile":"General\\Logger.cs"},{"SourceFile":"Net\\iLink.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"UI\\frmReader.cs"},{"SourceFile":"UI\\frmReader.Designer.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.8.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\HtmlAgilityPack.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\_Lib\\System.Data.SQLite.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Deployment.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.8\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Commesse\\_zPrivate\\A69WD\\Src\\A69WD\\bin\\Debug\\A69WD.exe","OutputItemRelativePath":"A69WD.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
|
||||||
@@ -64,17 +64,17 @@
|
|||||||
<Compile Include="Data\DBTools.cs" />
|
<Compile Include="Data\DBTools.cs" />
|
||||||
<Compile Include="Data\Helper.cs" />
|
<Compile Include="Data\Helper.cs" />
|
||||||
<Compile Include="General\Navigator.cs" />
|
<Compile Include="General\Navigator.cs" />
|
||||||
|
<Compile Include="Net\cLink_eRac.cs" />
|
||||||
<Compile Include="Net\eLinkState.cs" />
|
<Compile Include="Net\eLinkState.cs" />
|
||||||
<Compile Include="Net\cLink_A69.cs" />
|
<Compile Include="Net\cLink_A69.cs" />
|
||||||
<Compile Include="Service\Service_Crawler.cs" />
|
<Compile Include="Service\Service_Crawler.cs" />
|
||||||
<Compile Include="Service\Service_Importer.cs" />
|
<Compile Include="Service\Service_Importer.cs" />
|
||||||
<Compile Include="Site\cSite_A69.cs" />
|
|
||||||
<Compile Include="General\Cfg.cs" />
|
<Compile Include="General\Cfg.cs" />
|
||||||
<Compile Include="General\cTools.cs" />
|
<Compile Include="General\cTools.cs" />
|
||||||
<Compile Include="General\Logger.cs" />
|
<Compile Include="General\Logger.cs" />
|
||||||
<Compile Include="Net\iLink.cs" />
|
<Compile Include="Net\iLink.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Site\iSiteType.cs" />
|
<Compile Include="Service\Service_Import_Milu.cs" />
|
||||||
<Compile Include="UI\frmReader.cs">
|
<Compile Include="UI\frmReader.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
@@ -1075,7 +1075,7 @@ namespace A69WD {
|
|||||||
/// Importa il racconto passato sul DB
|
/// Importa il racconto passato sul DB
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="rac">Racconto d aimportare</param>
|
/// <param name="rac">Racconto d aimportare</param>
|
||||||
/// <returns>1 se tutto ok, -1 se importazione abortita per errore, -10 se importazione abortita per duplicato, ....</returns>
|
/// <returns>IDrac se tutto ok, -1 se importazione abortita per errore, -10 se importazione abortita per duplicato, ....</returns>
|
||||||
public int ImportRac(cRac rac) {
|
public int ImportRac(cRac rac) {
|
||||||
lock (objLock) {
|
lock (objLock) {
|
||||||
// Inizializzo le variabili che occorrono
|
// Inizializzo le variabili che occorrono
|
||||||
@@ -1947,7 +1947,7 @@ namespace A69WD {
|
|||||||
#region Reader function: GetReport, GetRandomIDrac
|
#region Reader function: GetReport, GetRandomIDrac
|
||||||
|
|
||||||
|
|
||||||
private long GetNumRacs(string TagFilter = "") {
|
public long GetNumRacs(string TagFilter = "") {
|
||||||
string query = "SELECT count (IDrac) FROM Racconti";
|
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 + "'"; }
|
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);
|
return Helper.ExecuteScalar(cn,query,objLock);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
namespace A69WD.Data {
|
namespace A69WD.Data {
|
||||||
|
|
||||||
@@ -11,7 +12,10 @@ namespace A69WD.Data {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class cNota {
|
public class cNota {
|
||||||
|
|
||||||
|
[XmlAttribute]
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
|
[XmlAttribute]
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
+56
-5
@@ -4,6 +4,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml.Serialization;
|
||||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
||||||
|
|
||||||
namespace A69WD.Data {
|
namespace A69WD.Data {
|
||||||
@@ -83,6 +84,8 @@ namespace A69WD.Data {
|
|||||||
/// Default: null
|
/// Default: null
|
||||||
/// Mappa la relazione tramite [Links_Rac_Aut] con la tabella [Autori].
|
/// Mappa la relazione tramite [Links_Rac_Aut] con la tabella [Autori].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[XmlArray("Autori")]
|
||||||
|
[XmlArrayItem("Autore")]
|
||||||
public List<string> Autori { get; set; } = new List<string>();
|
public List<string> Autori { get; set; } = new List<string>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -90,6 +93,8 @@ namespace A69WD.Data {
|
|||||||
/// Default: null
|
/// Default: null
|
||||||
/// Mappa la relazione tramite [Links_Rac_Tag] con la tabella [Tags].
|
/// Mappa la relazione tramite [Links_Rac_Tag] con la tabella [Tags].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[XmlArray("Tags")]
|
||||||
|
[XmlArrayItem("Tag")]
|
||||||
public List<string> Tags { get; set; } = new List<string>();
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -97,6 +102,8 @@ namespace A69WD.Data {
|
|||||||
/// Default: null
|
/// Default: null
|
||||||
/// Mappa la relazione tramite [Links_Rac_Ori] con la tabella [Origini].
|
/// Mappa la relazione tramite [Links_Rac_Ori] con la tabella [Origini].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[XmlArray("Origini")]
|
||||||
|
[XmlArrayItem("Origine")]
|
||||||
public List<string> Origini { get; set; } = new List<string>();
|
public List<string> Origini { get; set; } = new List<string>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -108,6 +115,8 @@ namespace A69WD.Data {
|
|||||||
/// Mappa la relazione tramite [Links_Rac_Not] con la tabella [Notes].
|
/// Mappa la relazione tramite [Links_Rac_Not] con la tabella [Notes].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
//public Dictionary<string, string> Note { get; set; } = new Dictionary<string, string>();
|
//public Dictionary<string, string> Note { get; set; } = new Dictionary<string, string>();
|
||||||
|
[XmlArray("Notes")]
|
||||||
|
[XmlArrayItem("Nota")]
|
||||||
public List<cNota> Notes { get; set; } = new List<cNota>();
|
public List<cNota> Notes { get; set; } = new List<cNota>();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -235,11 +244,11 @@ namespace A69WD.Data {
|
|||||||
}
|
}
|
||||||
} catch (Exception ex) { Logger.Log(new object[] { "Error Code:val001", "Errore in ATWD.Rac.Validate", ex }); }
|
} catch (Exception ex) { Logger.Log(new object[] { "Error Code:val001", "Errore in ATWD.Rac.Validate", ex }); }
|
||||||
|
|
||||||
try {
|
//try {
|
||||||
//if (!isValid) {
|
// //if (!isValid) {
|
||||||
// Logger.Warning("NOT VALIDATE: " + strIDrac + " - " + fullTitle);
|
// // 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)); }
|
//} 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;
|
return isValid;
|
||||||
}
|
}
|
||||||
@@ -278,7 +287,49 @@ namespace A69WD.Data {
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region Serializzazione su file XML
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Serializza l'oggetto cRac in xml
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Testo xml che serializza il cRac</returns>
|
||||||
|
public string ToXml() {
|
||||||
|
XmlSerializer serializer = new XmlSerializer(typeof(cRac));
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
serializer.Serialize(sw, this);
|
||||||
|
return sw.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deserializza l'oggetto cRac dal formato xml
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xml">Testo xml che serializza il cRac</param>
|
||||||
|
/// <returns>cRac che rappresenta il racconto ricavato dal testo xml</returns>
|
||||||
|
public static cRac FromXml(string xml) {
|
||||||
|
XmlSerializer serializer = new XmlSerializer(typeof(cRac));
|
||||||
|
StringReader sr = new StringReader(xml);
|
||||||
|
return (cRac)serializer.Deserialize(sr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Salva il cRac come file xml
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path dove salvare</param>
|
||||||
|
public void SaveToXmlFile(string path) {
|
||||||
|
File.WriteAllText(path, ToXml());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Carica il cRac dal file XML indicato
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path da dove caricare</param>
|
||||||
|
/// <returns>cRac che rappresenta il racconto ricavato dal file xml</returns>
|
||||||
|
public static cRac LoadFromXmlFile(string path) {
|
||||||
|
string xml = File.ReadAllText(path);
|
||||||
|
return FromXml(xml);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Crea il file html che rappresenta il racconto.
|
/// Crea il file html che rappresenta il racconto.
|
||||||
|
|||||||
@@ -119,6 +119,12 @@ namespace A69WD {
|
|||||||
public virtual string PathApplicationRoot { get { return applicationRootPath; } set { applicationRootPath = value; } }
|
public virtual string PathApplicationRoot { get { return applicationRootPath; } set { applicationRootPath = value; } }
|
||||||
private string applicationRootPath;
|
private string applicationRootPath;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Path della cartella con i file da importare.
|
||||||
|
/// </summary>
|
||||||
|
public virtual string PathImport { get { return pathImport; } set { pathImport = value; } }
|
||||||
|
private string pathImport;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Nome del database usato dall'applicazione [DEPRECATE].
|
/// Nome del database usato dall'applicazione [DEPRECATE].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -150,6 +156,12 @@ namespace A69WD {
|
|||||||
public virtual int nThread { get { return nthread; } set { nthread = value; } }
|
public virtual int nThread { get { return nthread; } set { nthread = value; } }
|
||||||
private int nthread;
|
private int nthread;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Numero di file massimo da gestire
|
||||||
|
/// </summary>
|
||||||
|
public virtual int MaxNumFile { get { return maxNumFile; } set { maxNumFile = value; } }
|
||||||
|
private int maxNumFile;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
@@ -225,6 +237,12 @@ namespace A69WD {
|
|||||||
}
|
}
|
||||||
private string pathAnalizadedRaccFile = "";
|
private string pathAnalizadedRaccFile = "";
|
||||||
|
|
||||||
|
|
||||||
|
public virtual string PathSrcDone => System.IO.Path.Combine(PathDownloadWorking, "Done");
|
||||||
|
public virtual string PathIdxDone => System.IO.Path.Combine(PathDownloadWorking, "Idx");
|
||||||
|
public virtual string PathSrcErrOnExtract => System.IO.Path.Combine(PathDownloadWorking, "ErrOnExtract");
|
||||||
|
public virtual string PathSrcErrOnSave => System.IO.Path.Combine(PathDownloadWorking, "ErrOnSave");
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+136
-54
@@ -1,13 +1,14 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace A69WD {
|
namespace A69WD {
|
||||||
|
|
||||||
public class cTools {
|
public class cTools {
|
||||||
@@ -47,6 +48,12 @@ namespace A69WD {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void SaveToFile(string txtHTML, string filePath, string fileName) {
|
||||||
|
System.IO.StreamWriter tsw = new System.IO.StreamWriter(System.IO.Path.Combine(filePath, fileName), false, Encoding.UTF8);
|
||||||
|
tsw.Write(txtHTML);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Metodo che legge un testo da file (UTF8)
|
/// Metodo che legge un testo da file (UTF8)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -470,7 +477,7 @@ namespace A69WD {
|
|||||||
/// <param name="txt">Testo da formattare</param>
|
/// <param name="txt">Testo da formattare</param>
|
||||||
/// <param name="eliminaTagHtml">Abilitare l'eliminazione di tutti i generici tag </param>
|
/// <param name="eliminaTagHtml">Abilitare l'eliminazione di tutti i generici tag </param>
|
||||||
/// <returns>Testo formattato</returns>
|
/// <returns>Testo formattato</returns>
|
||||||
public static string FormattaTesto(string txt, bool eliminaTagHtml) {
|
public static string FormattaTesto(string txt, bool eliminaTagHtml = true) {
|
||||||
try {
|
try {
|
||||||
// Analisi dei tag prima di levarli:
|
// Analisi dei tag prima di levarli:
|
||||||
string testo = Regex.Replace(txt, @"<P>", "\r\n", RegexOptions.IgnoreCase);
|
string testo = Regex.Replace(txt, @"<P>", "\r\n", RegexOptions.IgnoreCase);
|
||||||
@@ -497,6 +504,20 @@ namespace A69WD {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Special Entities dal sito https://www.htmlhelp.com/reference/html40/entities/special.html
|
// Special Entities dal sito https://www.htmlhelp.com/reference/html40/entities/special.html
|
||||||
|
// More can be added, see http://hotwired.lycos.com/webmonkey/reference/special_characters/
|
||||||
|
// Correggo risultato togliendo doppie linee e caratteri html:
|
||||||
|
testo = Regex.Replace(testo, @" ", " ", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"•", " * ", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"…", "…", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"™", "(tm)", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"©", "(c)", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"®", "(r)", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"⁄", "/", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"à", "à", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"è", "è", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"ì", "ì", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"ò", "ò", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"ù", "ù", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @""", "\"", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @""", "\"", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"&", "&", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"&", "&", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
||||||
@@ -521,8 +542,13 @@ namespace A69WD {
|
|||||||
testo = Regex.Replace(testo, @"€", "€", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"€", "€", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @""", "\"", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @""", "\"", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"&", "&", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"&", "&", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"'", "'", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @">", ">", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @">", ">", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"Č", "Č", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"č", "č", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"Ě", "Ě", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"ě", "ě", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"œ", "œ", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"œ", "œ", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"š", "š", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"š", "š", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"Ÿ", "Ÿ", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"Ÿ", "Ÿ", RegexOptions.IgnoreCase);
|
||||||
@@ -537,10 +563,13 @@ namespace A69WD {
|
|||||||
testo = Regex.Replace(testo, @"”", "”", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"”", "”", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"„", "„", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"„", "„", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"†", "†", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"†", "†", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"…", "…", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"
", " ", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"‰", "‰", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"‰", "‰", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"‹", "‹", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"‹", "‹", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"›", "›", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"›", "›", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"€", "€", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"€", "€", RegexOptions.IgnoreCase);
|
||||||
|
testo = Regex.Replace(testo, @"", " ", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @""", "\"", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @""", "\"", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"&", "&", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"&", "&", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
||||||
@@ -564,58 +593,17 @@ namespace A69WD {
|
|||||||
testo = Regex.Replace(testo, @"›", "›", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"›", "›", RegexOptions.IgnoreCase);
|
||||||
testo = Regex.Replace(testo, @"€", "€", RegexOptions.IgnoreCase);
|
testo = Regex.Replace(testo, @"€", "€", RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
|
// Correggo accenti per formati sbagliati:
|
||||||
|
while (testo.Contains("Ã ")) { testo = testo.Replace("Ã ", "à"); }
|
||||||
// Correggo risultato togliendo doppie linee e caratteri html:
|
while (testo.Contains("è")) { testo = testo.Replace("è", "è"); }
|
||||||
testo = Regex.Replace(testo, @" ", " ", RegexOptions.IgnoreCase);
|
while (testo.Contains("é")) { testo = testo.Replace("é", "é"); }
|
||||||
testo = Regex.Replace(testo, @"•", " * ", RegexOptions.IgnoreCase);
|
while (testo.Contains("ì")) { testo = testo.Replace("ì", "ì"); }
|
||||||
testo = Regex.Replace(testo, @"<", "<", RegexOptions.IgnoreCase);
|
while (testo.Contains("ò")) { testo = testo.Replace("ò", "ò"); }
|
||||||
testo = Regex.Replace(testo, @"›", " > ", RegexOptions.IgnoreCase);
|
while (testo.Contains("ù")) { testo = testo.Replace("ù", "ù"); }
|
||||||
testo = Regex.Replace(testo, @">", ">", RegexOptions.IgnoreCase);
|
while (testo.Contains("’")) { testo = testo.Replace("’", "'"); }
|
||||||
testo = Regex.Replace(testo, @"™", "(tm)", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"©", "(c)", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"®", "(r)", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"⁄", "/", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"à", "à", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"è", "è", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"ì", "ì", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"ò", "ò", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"ù", "ù", RegexOptions.IgnoreCase);
|
|
||||||
|
|
||||||
|
|
||||||
testo = Regex.Replace(testo, @"–", "–", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"—", "—", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"‘", "‘", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"’", "’", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"“", "“", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"”", "”", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"…", "…", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"Č", "Č", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"č", "č", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"Ě", "Ě", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"ě", "ě", RegexOptions.IgnoreCase);
|
|
||||||
|
|
||||||
testo = Regex.Replace(testo, @"
", " ", RegexOptions.IgnoreCase);
|
|
||||||
testo = Regex.Replace(testo, @"", " ", RegexOptions.IgnoreCase);
|
|
||||||
|
|
||||||
// // Remove all others. More can be added, see
|
|
||||||
// // http://hotwired.lycos.com/webmonkey/reference/special_characters/
|
|
||||||
// testo = Regex.Replace(testo, @"&(.{2,6});", string.Empty, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
|
|
||||||
|
|
||||||
//// Correggo accenti per formati sbagliati:
|
|
||||||
//while (testo.Contains("Ã ")) { testo = testo.Replace("Ã ", "à"); }
|
|
||||||
//while (testo.Contains("è")) { testo = testo.Replace("è", "è"); }
|
|
||||||
//while (testo.Contains("é")) { testo = testo.Replace("é", "é"); }
|
|
||||||
//while (testo.Contains("ì")) { testo = testo.Replace("ì", "ì"); }
|
|
||||||
//while (testo.Contains("ò")) { testo = testo.Replace("ò", "ò"); }
|
|
||||||
//while (testo.Contains("ù")) { testo = testo.Replace("ù", "ù"); }
|
|
||||||
//while (testo.Contains("’")) { testo = testo.Replace("’", "'"); }
|
|
||||||
|
|
||||||
// Correggo scritto:
|
// Correggo scritto:
|
||||||
testo = testo.Replace("&egrave", "è");
|
testo = testo.Replace("\r", "\n");
|
||||||
testo = testo.Replace("&", "&");
|
|
||||||
testo = testo.Replace("…", "…");
|
|
||||||
testo = testo.Replace("\r", "");
|
|
||||||
while (testo.Contains("\t")) { testo = testo.Replace("\t", " "); }
|
while (testo.Contains("\t")) { testo = testo.Replace("\t", " "); }
|
||||||
while (testo.Contains("...")) { testo = testo.Replace("...", "…"); }
|
while (testo.Contains("...")) { testo = testo.Replace("...", "…"); }
|
||||||
while (testo.Contains("….")) { testo = testo.Replace("….", "…"); }
|
while (testo.Contains("….")) { testo = testo.Replace("….", "…"); }
|
||||||
@@ -631,8 +619,6 @@ namespace A69WD {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static bool WriteStyleSheet(string FullFileName) {
|
public static bool WriteStyleSheet(string FullFileName) {
|
||||||
try {
|
try {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
@@ -647,6 +633,102 @@ namespace A69WD {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void Insert_Format_Tags(ref List<string> dst, List<string> items) {
|
||||||
|
try {
|
||||||
|
// // Rimuove duplicati e ordina alfabeticamente
|
||||||
|
// items = items
|
||||||
|
// .OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
// .Distinct() // elimina duplicati
|
||||||
|
// .ToList();
|
||||||
|
if (dst is null) { dst = new List<string>(); }
|
||||||
|
// Ordino ed elimino duplicati
|
||||||
|
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 "altro": // Src: Old_Milu
|
||||||
|
dst.Add("Altro");
|
||||||
|
break;
|
||||||
|
case "autoerotismo": // Src: Old_Milu
|
||||||
|
dst.Add("Masturbazione");
|
||||||
|
break;
|
||||||
|
case "bdsm": // Src: A69
|
||||||
|
dst.Add("BDSM");
|
||||||
|
break;
|
||||||
|
case "cuckold": // Src: Old_Milu
|
||||||
|
dst.Add("Cuckold");
|
||||||
|
break;
|
||||||
|
case "dominazione": // Src: Old_Milu
|
||||||
|
dst.Add("Dominazione");
|
||||||
|
break;
|
||||||
|
case "gay": // Src: Old_Milu
|
||||||
|
dst.Add("Gay");
|
||||||
|
break;
|
||||||
|
case "gay & bisex": // Src: A69
|
||||||
|
dst.Add("Bisex");
|
||||||
|
dst.Add("Gay");
|
||||||
|
break;
|
||||||
|
case "incesto": // Src: A69, Old_Milu
|
||||||
|
dst.Add("Incesto");
|
||||||
|
break;
|
||||||
|
case "lesbo": // Src: A69
|
||||||
|
case "saffico": // Src: Old_Milu
|
||||||
|
dst.Add("Lesbo");
|
||||||
|
break;
|
||||||
|
case "lirica": // Src: Old_Milu
|
||||||
|
dst.Add("Lirica");
|
||||||
|
break;
|
||||||
|
case "lui & lei": // Src: A69
|
||||||
|
case "etero": // Src: Old_Milu
|
||||||
|
dst.Add("Etero");
|
||||||
|
break;
|
||||||
|
case "orge": // Src: A69
|
||||||
|
case "orgia": // Src: Old_Milu
|
||||||
|
dst.Add("Orge");
|
||||||
|
break;
|
||||||
|
case "poesia": // Src: Old_Milu
|
||||||
|
dst.Add("Poesia");
|
||||||
|
break;
|
||||||
|
case "prime esperienze": // Src: A69
|
||||||
|
dst.Add("Prime Esperienze");
|
||||||
|
break;
|
||||||
|
case "scambio di coppia": // Src: A69
|
||||||
|
dst.Add("Scambismo");
|
||||||
|
break;
|
||||||
|
case "sensazioni": // Src: Old_Milu
|
||||||
|
dst.Add("Sensazioni");
|
||||||
|
break;
|
||||||
|
case "tradimenti": // Src: A69
|
||||||
|
dst.Add("Tradimenti");
|
||||||
|
break;
|
||||||
|
case "trans": // Src: A69, Old_Milu
|
||||||
|
dst.Add("Trans");
|
||||||
|
break;
|
||||||
|
case "trio": // Src: A69, Old_Milu
|
||||||
|
dst.Add("trio");
|
||||||
|
break;
|
||||||
|
//case "":
|
||||||
|
// dst.Add("");
|
||||||
|
// break;
|
||||||
|
default:
|
||||||
|
dst.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 (dst.Count == 0) dst.Add("_None_");
|
||||||
|
}
|
||||||
|
}//function
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // class Tools
|
} // class Tools
|
||||||
|
|
||||||
|
|||||||
+331
-266
@@ -3,6 +3,8 @@ using System.Collections.Concurrent;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
using System.Runtime.Remoting.Messaging;
|
using System.Runtime.Remoting.Messaging;
|
||||||
using System.Security.Policy;
|
using System.Security.Policy;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -43,7 +45,7 @@ namespace A69WD.Net {
|
|||||||
return !App.DB.IsPresent(URL);
|
return !App.DB.IsPresent(URL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public eLinkState Status { get => status; set { status = value; } }
|
public eLinkState Status { get => status; set { status = value; } }
|
||||||
|
|
||||||
@@ -85,7 +87,7 @@ namespace A69WD.Net {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static bool InsertStartLink(Service_Crawler service) {
|
public static bool InsertStartLink(Service_Crawler service) {
|
||||||
//string url = LinkIdxBase.Replace("{Categoria}", "altro").Replace("{ID}", "1"); //LinkIdxBase.Replace("{Categoria}", "trio").Replace("{ID}", "1");
|
//string url = LinkIdxBase.Replace("{Categoria}", "altro").Replace("{ID}", "1"); //LinkIdxBase.Replace("{Categoria}", "trio").Replace("{ID}", "1");
|
||||||
@@ -174,7 +176,7 @@ namespace A69WD.Net {
|
|||||||
rac.Title = cTools.FormattaTesto(nodes[0].InnerText.Trim(), false);
|
rac.Title = cTools.FormattaTesto(nodes[0].InnerText.Trim(), false);
|
||||||
if (string.IsNullOrEmpty(rac.Title)) {
|
if (string.IsNullOrEmpty(rac.Title)) {
|
||||||
Logger.Error($"A69 - Import - No Title - {filePathName}");
|
Logger.Error($"A69 - Import - No Title - {filePathName}");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} catch (Exception ex) { Logger.Error(string.Format("Fallita estrazione titolo dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
} catch (Exception ex) { Logger.Error(string.Format("Fallita estrazione titolo dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
#endregion
|
#endregion
|
||||||
@@ -222,7 +224,7 @@ namespace A69WD.Net {
|
|||||||
if (parts.Length == 3) {
|
if (parts.Length == 3) {
|
||||||
CultureInfo culture = CultureInfo.CreateSpecificCulture("it-IT");
|
CultureInfo culture = CultureInfo.CreateSpecificCulture("it-IT");
|
||||||
DateTimeStyles styles = DateTimeStyles.None;
|
DateTimeStyles styles = DateTimeStyles.None;
|
||||||
DateTime tmpDT = DateTime.Now;
|
DateTime tmpDT = DateTime.Now;
|
||||||
if (!DateTime.TryParse(parts[0].Trim(), culture, styles, out tmpDT)) {
|
if (!DateTime.TryParse(parts[0].Trim(), culture, styles, out tmpDT)) {
|
||||||
Logger.Error($"A69 - Import - No data - {filePathName}");
|
Logger.Error($"A69 - Import - No data - {filePathName}");
|
||||||
}
|
}
|
||||||
@@ -248,7 +250,9 @@ namespace A69WD.Net {
|
|||||||
.OrderBy(s => s) // ordina alfabeticamente
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
.Distinct() // elimina duplicati
|
.Distinct() // elimina duplicati
|
||||||
.ToList();
|
.ToList();
|
||||||
Format_Insert_Tags(rac, items); // rac.Tags = items;
|
List<string> tmpTags = new List<string>();
|
||||||
|
cTools.Insert_Format_Tags(ref tmpTags, items);
|
||||||
|
rac.Tags = tmpTags;
|
||||||
} catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione Tags dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
} catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione Tags dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -423,7 +427,10 @@ namespace A69WD.Net {
|
|||||||
.OrderBy(s => s) // ordina alfabeticamente
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
.Distinct() // elimina duplicati
|
.Distinct() // elimina duplicati
|
||||||
.ToList();
|
.ToList();
|
||||||
Format_Insert_Tags(rac, items); // rac.Tags = items;
|
//Format_Insert_Tags(rac, items); // rac.Tags = items;
|
||||||
|
List<string> tmpTags = new List<string>();
|
||||||
|
cTools.Insert_Format_Tags(ref tmpTags, items);
|
||||||
|
rac.Tags = tmpTags;
|
||||||
} catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione Tags dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
} catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione Tags dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -462,274 +469,332 @@ namespace A69WD.Net {
|
|||||||
return rac;
|
return rac;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void Format_Insert_Tags(Data.cRac rac, List<string> items) {
|
|
||||||
// Per ora riporto tutti i tag rilevati, mentre in futuro dovrò:
|
#region Gestione Sito A69
|
||||||
// - parsare la lista e formattare correttamente i tag
|
|
||||||
// - ordinare la lista dei tag formattati ed eliminare i duplicati
|
private static HttpClient client = null;
|
||||||
// - se non sono rimasti tag, inserisco il tag generale per indicare che non vi sono tag
|
private static readonly string nickname = @"Toky78";
|
||||||
// - altrimenti inserisco tutti i tag rimasti.
|
private static readonly string password = @"p!fw05Q9Hc6j5";
|
||||||
rac.Tags = new List<string>();
|
private static bool autenticated = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indica se siamo autenticati al sito
|
||||||
|
/// </summary>
|
||||||
|
public static bool Autenticated => autenticated;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Esegue l'autenticazione al sito:
|
||||||
|
/// - Scarica la pagina di autenticazione
|
||||||
|
/// - analizza quanto scaricato per determinare i campi dinamici 'ts' e 'token'
|
||||||
|
/// - prepara la risposta al form di identificazione
|
||||||
|
/// - invia il POST di autenticazione
|
||||||
|
/// - analizza la risposta per verificare il corretto login
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<bool> Authenticate() {
|
||||||
|
if (autenticated) {
|
||||||
|
// Autenticazione già fatta, posso proseguire senza altro fare
|
||||||
|
Logger.Warning("A69 - Autenticazione già effettuata.");
|
||||||
|
}
|
||||||
try {
|
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":
|
#region 1) Prepare HTML Client
|
||||||
// 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:
|
HttpClientHandler _handler = new HttpClientHandler {
|
||||||
rac.Tags.Add(item);
|
CookieContainer = new CookieContainer(),
|
||||||
break;
|
UseCookies = true,
|
||||||
}
|
AllowAutoRedirect = true,
|
||||||
#endregion
|
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
||||||
tmp = it;
|
};
|
||||||
|
|
||||||
}//if
|
client = new HttpClient(_handler);
|
||||||
|
client.Timeout = TimeSpan.FromSeconds(60);
|
||||||
|
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
|
||||||
|
client.DefaultRequestHeaders.Referrer = new Uri(cLink_A69.LoginPageUrl);
|
||||||
|
|
||||||
}//foreach
|
#endregion
|
||||||
|
|
||||||
|
#region 2) GET pagina di login
|
||||||
|
|
||||||
|
Console.WriteLine("A69 - Richiedo la pagina di login...");
|
||||||
|
Logger.Information("A69 - Richiedo la pagina di login...");
|
||||||
|
string loginPageHtml = await client.GetStringAsync(cLink_A69.LoginPageUrl);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 3) Parsing HTML per estrarre ts e token
|
||||||
|
|
||||||
|
var doc = new HtmlAgilityPack.HtmlDocument();
|
||||||
|
doc.LoadHtml(loginPageHtml);
|
||||||
|
|
||||||
|
string ts = doc.DocumentNode
|
||||||
|
.SelectSingleNode("//input[@name='ts']")
|
||||||
|
?.GetAttributeValue("value", "");
|
||||||
|
string token = doc.DocumentNode
|
||||||
|
.SelectSingleNode("//input[@name='token']")
|
||||||
|
?.GetAttributeValue("value", "");
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(ts) || string.IsNullOrWhiteSpace(token)) {
|
||||||
|
Console.WriteLine("A69 - Impossibile estrarre 'ts' o 'token' dalla pagina di login.");
|
||||||
|
Logger.Information("A69 - Impossibile estrarre 'ts' o 'token' dalla pagina di login.");
|
||||||
|
return autenticated;
|
||||||
|
}
|
||||||
|
Console.WriteLine($"A69 - Parametri dinamici trovati: ts={ts}, token={token}");
|
||||||
|
Logger.Information($"A69 - Parametri dinamici trovati: ts={ts}, token={token}");
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 4) POST login con valori dinamici
|
||||||
|
|
||||||
|
var loginData = new FormUrlEncodedContent(new[] {
|
||||||
|
new KeyValuePair<string,string>("nick", nickname),
|
||||||
|
new KeyValuePair<string,string>("pwd", password),
|
||||||
|
new KeyValuePair<string,string>("ricordami","1"),
|
||||||
|
new KeyValuePair<string,string>("login", "Entra"),
|
||||||
|
new KeyValuePair<string,string>("ts", ts),
|
||||||
|
new KeyValuePair<string,string>("token", token)
|
||||||
|
});
|
||||||
|
|
||||||
|
Console.WriteLine("Invio credenziali di login...");
|
||||||
|
var loginResponse = await client.PostAsync(cLink_A69.LoginPostUrl, loginData);
|
||||||
|
|
||||||
|
if (!loginResponse.IsSuccessStatusCode) {
|
||||||
|
Console.WriteLine($"A69 - Login fallito. HTTP {(int)loginResponse.StatusCode} {loginResponse.ReasonPhrase}");
|
||||||
|
Logger.Information($"A69 - Login fallito. HTTP {(int)loginResponse.StatusCode} {loginResponse.ReasonPhrase}");
|
||||||
|
return autenticated;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 5) Verifica autenticazione correttamente avvenuta
|
||||||
|
|
||||||
|
// Verifica semplice: sulla pagina di login effettuato, ricerco il nome dell'utente:
|
||||||
|
string loginResult = await loginResponse.Content.ReadAsStringAsync();
|
||||||
|
if (loginResult.Contains(nickname)) {
|
||||||
|
Console.WriteLine("A69 - Login effettuato con successo! Sessione autenticata attiva.");
|
||||||
|
Logger.Information("A69 - Login effettuato con successo! Sessione autenticata attiva.");
|
||||||
|
autenticated = true;
|
||||||
|
} else {
|
||||||
|
Console.WriteLine("A69 - Login non riuscito: il server ha restituito un messaggio di errore.");
|
||||||
|
Logger.Information("A69 - Login non riuscito: il server ha restituito un messaggio di errore.");
|
||||||
|
autenticated = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} 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));
|
Console.WriteLine($"Errore generale: {ex.Message}");
|
||||||
} finally {
|
Logger.Information($"Errore generale: {ex.Message}");
|
||||||
if (rac.Tags.Count == 0) rac.Tags.Add("_None_");
|
|
||||||
}
|
}
|
||||||
}//function
|
return autenticated;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Codice da eseguire per ciascun A69 link:
|
||||||
|
/// - scarico l'url indicato
|
||||||
|
/// - se richiesto lo salvo come file di testo
|
||||||
|
/// - analizzo il documento html ed estraggo tutti gli url ad altre pagine di link
|
||||||
|
/// - analizzo il documento html ed estraggo tutti gli url a racconti
|
||||||
|
/// - analizzo il documento html ed estraggo il testo del racconto
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="lk"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<List<iLink>> CrawlPageAsync() {
|
||||||
|
var newlinks = new List<iLink>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Console.WriteLine($"A69 - Scarico: {URL}");
|
||||||
|
HtmlDocument tdoc = null;
|
||||||
|
string thtml = "";
|
||||||
|
|
||||||
|
#region ToConfirm
|
||||||
|
if (Status == eLinkState.ToConfirm) {
|
||||||
|
// Eseguo la verifica se link da downloadare
|
||||||
|
Status = eLinkState.ToDownload;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ToDownload
|
||||||
|
if (Status == eLinkState.ToDownload) {
|
||||||
|
Status = eLinkState.OnDownload;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region OnDownload
|
||||||
|
if (Status == eLinkState.OnDownload) {
|
||||||
|
// Scarico il file
|
||||||
|
var resp = await client.GetAsync(URL);
|
||||||
|
if (!resp.IsSuccessStatusCode) {
|
||||||
|
Console.WriteLine($"A69 - Errore HTTP {(int)resp.StatusCode} {resp.ReasonPhrase} per {URL}");
|
||||||
|
Status = eLinkState.Error;
|
||||||
|
//App.DB.LinkLog(lk);
|
||||||
|
return newlinks;
|
||||||
|
}
|
||||||
|
// Scarico la pagina
|
||||||
|
thtml = await client.GetStringAsync(URL);
|
||||||
|
tdoc = new HtmlDocument();
|
||||||
|
tdoc.LoadHtml(thtml);
|
||||||
|
// Salvo il file downloadato
|
||||||
|
//SaveToFile(thtml, lk.FilePath, lk.FileName);
|
||||||
|
|
||||||
|
Status = eLinkState.ToAnalize;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ToAnalize
|
||||||
|
{
|
||||||
|
if (Status == eLinkState.ToAnalize) {
|
||||||
|
List<string> tmpLk = new List<string>();
|
||||||
|
|
||||||
|
#region Estraggo gli url ad indici:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Gli url delle pagine di indice sono del tipo:
|
||||||
|
*
|
||||||
|
* <div id="pagination">
|
||||||
|
* <ul>
|
||||||
|
* <li class="prev"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=2">‹</a></li>
|
||||||
|
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=1">1</a></li>
|
||||||
|
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=2">2</a></li>
|
||||||
|
* <li class="currentpage">3</li>
|
||||||
|
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=4">4</a></li>
|
||||||
|
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=5">5</a></li>
|
||||||
|
* <li class="next"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=4">›</a></li>
|
||||||
|
* </ul>
|
||||||
|
* </div>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
// Estraggo i link alle altre pagine:
|
||||||
|
var tnodes = tdoc.DocumentNode.SelectNodes("//div[@id='pagination']//ul//li//a[@href]");
|
||||||
|
if (tnodes != null) {
|
||||||
|
foreach (var link in tnodes) {
|
||||||
|
var href = link.GetAttributeValue("href", "");
|
||||||
|
if (!string.IsNullOrEmpty(href) && href.StartsWith("/racconti-erotici/racconti_lista.php?genere="))
|
||||||
|
tmpLk.Add(href); //tmpLk.Add(cLink_A69.PageBase + href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Rimuove duplicati e ordina alfabeticamente
|
||||||
|
tmpLk = tmpLk
|
||||||
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
.Distinct() // elimina duplicati
|
||||||
|
.ToList();
|
||||||
|
// Inserisco i link trovati
|
||||||
|
foreach (string ilk in tmpLk) {
|
||||||
|
string[] separator = new string[] { "&pagina=" };
|
||||||
|
string[] txt = ilk.Split(separator, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
string url = cLink_A69.PageBase + ilk;
|
||||||
|
string name = txt[0].Replace("/racconti-erotici/racconti_lista.php?genere=", "_A69_") + "_" + int.Parse(txt[1]).ToString("0000") + ".html";
|
||||||
|
newlinks.Add(new cLink_A69(url, name));
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.Error("Errore analisi Idx link dal " + FileName + " - " + ex.Message);
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnExtract, FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Estraggo gli url a racconti:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* I link ai racconti sono dei pulsanti così formati:
|
||||||
|
* <div class="continua">
|
||||||
|
* <a href="/racconti-erotici/altro/Tutto-e-iniziato-per-gioco-pazza-famiglia_166770.html">Continua a leggere » </a>
|
||||||
|
* </div>
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
// Estraggo i link ai racconti:
|
||||||
|
tmpLk = new List<string>();
|
||||||
|
// Estraggo i link alle altre pagine:
|
||||||
|
var tnodes = tdoc.DocumentNode.SelectNodes("//div[@class='continua']//a[@href]");
|
||||||
|
if (tnodes != null) {
|
||||||
|
foreach (var link in tnodes) {
|
||||||
|
var href = link.GetAttributeValue("href", "");
|
||||||
|
if (!string.IsNullOrEmpty(href) && href.StartsWith("/racconti-erotici/") && (href.EndsWith(".html") || href.EndsWith(".htm")))
|
||||||
|
tmpLk.Add(href); //tmpLk.Add(cLink_A69.PageBase + href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Rimuove duplicati e ordina alfabeticamente
|
||||||
|
tmpLk = tmpLk
|
||||||
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
.Distinct() // elimina duplicati
|
||||||
|
.ToList();
|
||||||
|
// Inserisco i link trovati
|
||||||
|
foreach (string ilk in tmpLk) {
|
||||||
|
string url = cLink_A69.PageBase + ilk;
|
||||||
|
string name = ilk.Replace("/racconti-erotici/", "A69_").Replace(@"/", "_");
|
||||||
|
newlinks.Add(new cLink_A69(url, name));
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.Error("Errore analisi Idx link dal " + FileName + " - " + ex.Message);
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnExtract, FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Estraggo il racconto dal file e lo inserisco nel DB
|
||||||
|
if (FileName.StartsWith("A69_")) {
|
||||||
|
// Link ad un racconto
|
||||||
|
cRac rac = EstraiRac(tdoc);
|
||||||
|
if (rac != null) {
|
||||||
|
// Racconto estratto correttamente, lo salvo sul DB
|
||||||
|
int res = App.DB.ImportRac(rac);
|
||||||
|
if (res > 0) {
|
||||||
|
// Racconto salvato correttamente sul DB
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcDone, FileName);
|
||||||
|
} else {
|
||||||
|
// Errore nel salvataggio sul DB
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnSave, FileName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Estrazione del racconto fallita
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnExtract, FileName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Link ad un indice
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathIdxDone, FileName);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
Status = eLinkState.End;
|
||||||
|
App.DB.LinkLog(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region End
|
||||||
|
if (Status == eLinkState.End) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Error
|
||||||
|
if (Status == eLinkState.Error) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Abort
|
||||||
|
if (Status == eLinkState.Abort) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Cancel
|
||||||
|
if (Status == eLinkState.Cancel) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
Console.WriteLine("Link.Count=" + newlinks.Count.ToString("00"));
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Console.WriteLine($"Errore con {URL}: {ex.Message}");
|
||||||
|
Status = eLinkState.Error;
|
||||||
|
App.DB.LinkLog(this);
|
||||||
|
}
|
||||||
|
return newlinks;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,589 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using A69WD.Data;
|
||||||
|
using A69WD.Service;
|
||||||
|
using HtmlAgilityPack;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace A69WD.Net {
|
||||||
|
|
||||||
|
public class cLink_eRac : iLink {
|
||||||
|
|
||||||
|
private readonly string filename;
|
||||||
|
private readonly string filepath;
|
||||||
|
private eLinkState status = eLinkState.ToConfirm;
|
||||||
|
private string fields = "";
|
||||||
|
|
||||||
|
public static string PageBase { get { return "https://www.eroticiracconti.it"; } }
|
||||||
|
|
||||||
|
public static string LinkIdxBase { get { return "https://www.eroticiracconti.it/archivio/Tutto/{ID}"; } }
|
||||||
|
public static string LinkRacBase { get { return "https://www.eroticiracconti.it/racconto/{RacID}"; } }
|
||||||
|
|
||||||
|
public string ID => "eRac";
|
||||||
|
|
||||||
|
public string URL { get; }
|
||||||
|
|
||||||
|
public string FileName => filename;
|
||||||
|
|
||||||
|
public string FilePath { get => filepath; }
|
||||||
|
|
||||||
|
public bool Validate {
|
||||||
|
get {
|
||||||
|
if (URL.StartsWith("https://www.eroticiracconti.it/archivio/Tutto/")) {
|
||||||
|
// URL di tipo Idx, devo lavorare i link nuovo o rilavorare i link più obsoleti di 6 ore.
|
||||||
|
return !App.DB.IsPresent(URL, -6);
|
||||||
|
} else {
|
||||||
|
// URL di tipo Rac, devo lavorare solo i link nuovi
|
||||||
|
return !App.DB.IsPresent(URL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public eLinkState Status { get => status; set { status = value; } }
|
||||||
|
|
||||||
|
public string Fields { get => fields; set => fields = value; }
|
||||||
|
|
||||||
|
public cLink_eRac(string Url, string Filename, string fields = "none", string Filepath = "") {
|
||||||
|
this.URL = Url;
|
||||||
|
this.filename = Filename;
|
||||||
|
this.fields = fields;
|
||||||
|
this.filepath = string.IsNullOrEmpty(Filepath) ? Cfg.Settings.PathDownloadWorking : Filepath;
|
||||||
|
this.status = eLinkState.ToConfirm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static bool InsertStartLink(Service_Crawler service) {
|
||||||
|
try {
|
||||||
|
int i = 0;
|
||||||
|
string url = LinkIdxBase.Replace("{ID}", i.ToString());
|
||||||
|
string name = $"_eRac_Idx_{i.ToString("0000")}.html";
|
||||||
|
service.EnqueueUrl(new cLink_eRac(url, name));
|
||||||
|
return true;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.Error("Errore inserendo eRac Start Link - " + ex.Message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public cRac EstraiRac(HtmlDocument doc) {
|
||||||
|
/*
|
||||||
|
* Analisi html dei racconti aggiornata al 2025/12/27:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Per ciascun file html, si ha un unico racconto che ha un formato interno pari a:
|
||||||
|
* <!DOCTYPE html>
|
||||||
|
* <html lang="it">
|
||||||
|
* <head>
|
||||||
|
* ...
|
||||||
|
* <title> Quante voglie. | Erotici Racconti</title>
|
||||||
|
* </head>
|
||||||
|
* <body>
|
||||||
|
* <div class="main">
|
||||||
|
* <main>
|
||||||
|
* <div class="story">
|
||||||
|
* <h1 class="tit">{Title}</h1>
|
||||||
|
* <h2>
|
||||||
|
* <span class="infos">
|
||||||
|
* <span>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-autore"></use></svg>
|
||||||
|
* di<br>
|
||||||
|
* <a href="{URL_Autor}" rel="author">{Autor}</a>
|
||||||
|
* </span>
|
||||||
|
* <span>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-cat-etero"></use></svg>
|
||||||
|
* genere<br>
|
||||||
|
* <a href="{URL_Genere}">{Genere}</a>
|
||||||
|
* </span>
|
||||||
|
* </span>
|
||||||
|
* </h2>
|
||||||
|
* <div class="tes">
|
||||||
|
* {Trama}
|
||||||
|
* </div>
|
||||||
|
* <div class="infos">
|
||||||
|
* <div>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-autore"></use></svg>
|
||||||
|
* di<br><strong>
|
||||||
|
* <a href="{URL_Autor}" rel="author">{Autor}</a>
|
||||||
|
* </div>
|
||||||
|
* <div>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-calendario"></use></svg>
|
||||||
|
* scritto il<br>
|
||||||
|
* <strong>{Data}</strong>
|
||||||
|
* </div>
|
||||||
|
* <div>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-eye"></use></svg>
|
||||||
|
* <span class="counterBoard"><span class="digit d20">5</span><span class="digit d20">.</span><span class="digit d20">1</span><span class="digit d20">K</span></span>
|
||||||
|
* <br>
|
||||||
|
* visite
|
||||||
|
* </div>
|
||||||
|
* </div>
|
||||||
|
* <div class="infos">
|
||||||
|
* <div>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-vote-check"></use></svg>
|
||||||
|
* <span class="counterBoard">
|
||||||
|
* <span class="digit d20">3</span>
|
||||||
|
* </span><br>
|
||||||
|
* voti
|
||||||
|
* </div>
|
||||||
|
* <div>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-medaglia"></use></svg>
|
||||||
|
* valutazione<br>
|
||||||
|
* <strong>2</strong><br>
|
||||||
|
* <div class="scoreBar"><div class="bar"><div class="inner" style="width: 100%"></div></div><div class="bar"><div class="inner" style="width: 100%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div><div class="bar"><div class="inner" style="width: 0%"></div></div></div>
|
||||||
|
* </div>
|
||||||
|
* </div>
|
||||||
|
*
|
||||||
|
* <div class="infos">
|
||||||
|
* <div>
|
||||||
|
* <svg class="icon"><use xlink:href="#icon-ballot-box"></use></svg>
|
||||||
|
* il tuo voto<br>
|
||||||
|
* <div class="selector ">
|
||||||
|
* <a href="#" score="0.1" class="sec ">1</a><a href="#" score="0.2" class="sec ">2</a><a href="#" score="0.3" class="sec ">3</a><a href="#" score="0.4" class="sec ">4</a><a href="#" score="0.5" class="sec ">5</a><a href="#" score="0.6" class="sec ">6</a><a href="#" score="0.7" class="sec ">7</a><a href="#" score="0.8" class="sec ">8</a><a href="#" score="0.9" class="sec ">9</a><a href="#" score="1" class="sec ">10</a> <div class="loadingBar"></div>
|
||||||
|
* </div>
|
||||||
|
* </div>
|
||||||
|
* </div>
|
||||||
|
* ...
|
||||||
|
* </div>
|
||||||
|
* ...
|
||||||
|
* </main>
|
||||||
|
* ...
|
||||||
|
* </div>
|
||||||
|
* </body>
|
||||||
|
* </html>
|
||||||
|
*
|
||||||
|
* quindi i dati del racconto che si possono estrapolare sono:
|
||||||
|
* Titolo: --> Testo del nodo <div class="story"><h1 class="tit">{Title}</h1></div>
|
||||||
|
* SubTitle: --> Sempre Vuoto
|
||||||
|
* Autore: --> Testo del nodo <div class="story"><h2><span class="infos"><span><a href="{URL_Autor}" rel="author">{Autor}</a></span></span></h2></div>
|
||||||
|
* Creato: --> Estrarre la parte dal <div class="story"><div class="infos"><div><strong>{Data}</strong></div></div></div>
|
||||||
|
* Tags: --> Testo del nodo <div class="story"><h2><span class="infos"><span><a href="{URL_Genere}">{Genere}</a></span></span></h2></div>
|
||||||
|
* Trama: --> Testo del nodo <div class="story"><div class="tes">{Trama}</div></div>
|
||||||
|
* Notes: --> SrcFile - Nome del file che si analizza
|
||||||
|
* Origini: --> Sempre l'ID della sorgente web
|
||||||
|
* Voto: --> Sempre "Non Letto"
|
||||||
|
* Updated: --> Data attuale
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
cRac rac = new cRac();
|
||||||
|
HtmlNodeCollection nodes;
|
||||||
|
try {
|
||||||
|
Console.WriteLine($"eRac - Importo: {FileName}");
|
||||||
|
|
||||||
|
// Ricavo il nodo radice del racconto: <div class="story">
|
||||||
|
//HtmlNode root = doc.DocumentNode;
|
||||||
|
HtmlNode root = doc.DocumentNode.SelectSingleNode("//div[@class='story']");
|
||||||
|
|
||||||
|
if (root == null) {
|
||||||
|
// racconto non presente
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Origini: --> Sempre l'ID della sorgente web
|
||||||
|
rac.Origini = new List<string> { ID };
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Titolo: --> Testo del nodo <div class="story"><h1 class="tit">{Title}</h1></div>
|
||||||
|
try {
|
||||||
|
nodes = root.SelectNodes("//h1[@class='tit']");
|
||||||
|
rac.Title = cTools.FormattaTesto(nodes[0].InnerText.Trim(), false);
|
||||||
|
if (string.IsNullOrEmpty(rac.Title)) {
|
||||||
|
Logger.Error($"eRac - Import - No Title - {FileName}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} catch (Exception ex) { Logger.Error(string.Format("Fallita estrazione titolo dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region SubTitle: --> Sempre Vuoto
|
||||||
|
rac.SubTitle = "";
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Autore: --> Testo del nodo <div class="story"><h2><span class="infos"><span><a href="{URL_Autor}" rel="author">{Autor}</a></span></span></h2></div>
|
||||||
|
try {
|
||||||
|
//nodes = root.SelectNodes("//h2//span[@class='infos']//span[]//a");
|
||||||
|
nodes = root.SelectNodes("//a[@rel='author']");
|
||||||
|
List<string> items = new List<string>();
|
||||||
|
foreach (HtmlNode nd in nodes) {
|
||||||
|
string aut = nd.ParentNode.InnerText.Replace(" ", "").Trim();
|
||||||
|
if (aut.StartsWith("di")) {
|
||||||
|
items.Add(aut.Replace("di", "").Trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
items.Sort();
|
||||||
|
string tmp = "";
|
||||||
|
rac.Autori = new List<string>();
|
||||||
|
// Rimuovo eventuali duplicati
|
||||||
|
foreach (string aut in items) {
|
||||||
|
if (tmp != aut) {
|
||||||
|
rac.Autori.Add(aut);
|
||||||
|
tmp = aut;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rac.Autori == null || string.IsNullOrEmpty(rac.Autori[0])) {
|
||||||
|
Logger.Error($"eRac - Import - No Autors - {FileName}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} catch (Exception ex) { Logger.Error(string.Format("Fallita estrazione autore dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Creato: --> Estrarre la parte dal <div style="float:left; margin-right:5px; color: #9999CC; ">
|
||||||
|
rac.Creato = DateTime.Now;
|
||||||
|
try {
|
||||||
|
// Creato --> Estrarre la prima parte dal <div class="story"><div class="infos"><div><strong>{Data}</strong></div></div></div>
|
||||||
|
nodes = root.SelectNodes("//div[@class='infos']//div");
|
||||||
|
foreach (HtmlNode nd in nodes) {
|
||||||
|
string txt = nd.InnerText.Trim().Replace(" ", "");
|
||||||
|
if (txt.StartsWith("scritto il")) {
|
||||||
|
CultureInfo culture = CultureInfo.CreateSpecificCulture("it-IT");
|
||||||
|
DateTimeStyles styles = DateTimeStyles.None;
|
||||||
|
DateTime tmpDT = DateTime.Now;
|
||||||
|
if (!DateTime.TryParse(txt.Replace("scritto il", "").Trim(), culture, styles, out tmpDT)) {
|
||||||
|
Logger.Error($"eRac - Import - No data - {FileName}");
|
||||||
|
}
|
||||||
|
rac.Creato = tmpDT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ex) { Logger.Warning(string.Format("Data non riconosciuta nel file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Updated: --> Data attuale
|
||||||
|
rac.Updated = DateTime.Now;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Tags: --> Testo del nodo <div class="story"><h2><span class="infos"><span><a href="{URL_Genere}">{Genere}</a></span></span></h2></div>
|
||||||
|
try {
|
||||||
|
//nodes = root.SelectNodes("//h2//span[@class='infos']//span//a");
|
||||||
|
nodes = root.SelectNodes("//h2//span[@class='infos']//span");
|
||||||
|
List<string> items = new List<string>();
|
||||||
|
foreach (HtmlNode nd in nodes) {
|
||||||
|
string txt = nd.InnerText.Trim();
|
||||||
|
if (txt.StartsWith("genere")) {
|
||||||
|
items.Add(cTools.FormattaTesto(txt.Replace("genere", "").Trim(), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//items.Sort();
|
||||||
|
items = items
|
||||||
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
.Distinct() // elimina duplicati
|
||||||
|
.ToList();
|
||||||
|
//Format_Insert_Tags(rac, items); // rac.Tags = items;
|
||||||
|
List<string> tmpTags = new List<string>();
|
||||||
|
cTools.Insert_Format_Tags(ref tmpTags, items);
|
||||||
|
rac.Tags = tmpTags;
|
||||||
|
} catch (Exception ex) { Logger.Warning(string.Format("Fallita estrazione Tags dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Trama: --> Testo del nodo <div class="testoracc"> a cui si levano i DIV interni.
|
||||||
|
try {
|
||||||
|
nodes = root.SelectNodes("//div[@class='tes']");
|
||||||
|
foreach (HtmlNode nd in nodes) {
|
||||||
|
foreach (HtmlNode n in nd.ChildNodes) {
|
||||||
|
if (n.Name.ToUpper() == "#TEXT") { rac.Trama += cTools.FormattaTesto(n.InnerText.Trim(), false); }
|
||||||
|
if (n.Name.ToUpper() == "BR") { rac.Trama += "\r"; }
|
||||||
|
if (n.Name.ToUpper() == "DIV") {; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ex) { Logger.Error(string.Format("Fallita estrazione Trama dal file {0}\r\n{1}", FileName, ex.Message)); return null; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Voto: --> Sempre "Non Letto"
|
||||||
|
rac.Voto = "Non Letto";
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Notes: --> SrcFile - Nome del file che si analizza
|
||||||
|
rac.Notes = new List<Data.cNota>();
|
||||||
|
rac.Notes.Add(new Data.cNota("SrcFile", System.IO.Path.GetFileName(FileName)));
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
// Formalizzo esito estrazione:
|
||||||
|
if (!rac.Validate()) {
|
||||||
|
rac = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.Error($"eRac - Import Error - {FileName}: {ex.Message}");
|
||||||
|
Console.WriteLine($"eRac - Import Error - {FileName}: {ex.Message}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return rac;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region Gestione Sito eRac
|
||||||
|
|
||||||
|
private static HttpClient client = null;
|
||||||
|
private static bool autenticated = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indica se siamo autenticati al sito
|
||||||
|
/// </summary>
|
||||||
|
public static bool Autenticated => autenticated;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Esegue l'autenticazione al sito:
|
||||||
|
/// - Scarica la pagina di autenticazione
|
||||||
|
/// - analizza quanto scaricato per determinare i campi dinamici 'ts' e 'token'
|
||||||
|
/// - prepara la risposta al form di identificazione
|
||||||
|
/// - invia il POST di autenticazione
|
||||||
|
/// - analizza la risposta per verificare il corretto login
|
||||||
|
/// </summary>
|
||||||
|
public static async Task<bool> Authenticate() {
|
||||||
|
if (autenticated) {
|
||||||
|
// Autenticazione già fatta, posso proseguire senza altro fare
|
||||||
|
Logger.Warning("eRac - Autenticazione già effettuata.");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
|
||||||
|
#region 1) Prepare HTML Client
|
||||||
|
|
||||||
|
HttpClientHandler _handler = new HttpClientHandler {
|
||||||
|
CookieContainer = new CookieContainer(),
|
||||||
|
UseCookies = true,
|
||||||
|
AllowAutoRedirect = true,
|
||||||
|
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
||||||
|
};
|
||||||
|
|
||||||
|
client = new HttpClient(_handler);
|
||||||
|
client.Timeout = TimeSpan.FromSeconds(60);
|
||||||
|
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
|
||||||
|
client.DefaultRequestHeaders.Referrer = new Uri(cLink_eRac.PageBase);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
autenticated = true;
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Console.WriteLine($"Errore generale: {ex.Message}");
|
||||||
|
Logger.Information($"Errore generale: {ex.Message}");
|
||||||
|
}
|
||||||
|
return autenticated;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Codice da eseguire per ciascun eRac link:
|
||||||
|
/// - scarico l'url indicato
|
||||||
|
/// - se richiesto lo salvo come file di testo
|
||||||
|
/// - analizzo il documento html ed estraggo tutti gli url ad altre pagine di link
|
||||||
|
/// - analizzo il documento html ed estraggo tutti gli url a racconti
|
||||||
|
/// - analizzo il documento html ed estraggo il testo del racconto
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="lk"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<List<iLink>> CrawlPageAsync() {
|
||||||
|
var newlinks = new List<iLink>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Console.WriteLine($"eRac - Scarico: {URL}");
|
||||||
|
HtmlDocument tdoc = null;
|
||||||
|
string thtml = "";
|
||||||
|
|
||||||
|
#region ToConfirm
|
||||||
|
if (Status == eLinkState.ToConfirm) {
|
||||||
|
// Eseguo la verifica se link da downloadare
|
||||||
|
Status = eLinkState.ToDownload;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ToDownload
|
||||||
|
if (Status == eLinkState.ToDownload) {
|
||||||
|
Status = eLinkState.OnDownload;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region OnDownload
|
||||||
|
if (Status == eLinkState.OnDownload) {
|
||||||
|
// Scarico il file
|
||||||
|
var resp = await client.GetAsync(URL);
|
||||||
|
if (!resp.IsSuccessStatusCode) {
|
||||||
|
Console.WriteLine($"eRac - Errore HTTP {(int)resp.StatusCode} {resp.ReasonPhrase} per {URL}");
|
||||||
|
Status = eLinkState.Error;
|
||||||
|
//App.DB.LinkLog(lk);
|
||||||
|
return newlinks;
|
||||||
|
}
|
||||||
|
// Scarico la pagina
|
||||||
|
thtml = await client.GetStringAsync(URL);
|
||||||
|
tdoc = new HtmlDocument();
|
||||||
|
tdoc.LoadHtml(thtml);
|
||||||
|
// Salvo il file downloadato
|
||||||
|
//SaveToFile(thtml, lk.FilePath, lk.FileName);
|
||||||
|
|
||||||
|
Status = eLinkState.ToAnalize;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ToAnalize
|
||||||
|
{
|
||||||
|
if (Status == eLinkState.ToAnalize) {
|
||||||
|
List<string> tmpLk = new List<string>();
|
||||||
|
|
||||||
|
#region Estraggo gli url ad indici:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Gli url delle pagine di indice sono del tipo:
|
||||||
|
*
|
||||||
|
* <div class="pagination">
|
||||||
|
* <a href="/archivio/Tutto">⇤</a>
|
||||||
|
* <a rel="prev" href="/archivio/Tutto/0">⇠</a>
|
||||||
|
* <a href="/archivio/Tutto/0">1</a>
|
||||||
|
* <a class="current">2</a>
|
||||||
|
* <a href="/archivio/Tutto/2">3</a>
|
||||||
|
* <a href="/archivio/Tutto/3">4</a>
|
||||||
|
* <a href="/archivio/Tutto/4">5</a>
|
||||||
|
* <a href="/archivio/Tutto/5">6</a>
|
||||||
|
* <a href="/archivio/Tutto/6">7</a>
|
||||||
|
* <a href="/archivio/Tutto/7">8</a>
|
||||||
|
* <a href="/archivio/Tutto/8">9</a>
|
||||||
|
* <a href="/archivio/Tutto/9">10</a>
|
||||||
|
* <a href="/archivio/Tutto/10">11</a>
|
||||||
|
* <a class="plain">...</a>
|
||||||
|
* <a rel="next" href="/archivio/Tutto/2">⇢</a>
|
||||||
|
* <a href="/archivio/Tutto/3146">⇥</a>
|
||||||
|
* </div>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
// Estraggo i link alle altre pagine:
|
||||||
|
var tnodes = tdoc.DocumentNode.SelectNodes("//div[@class='pagination']//a[@href]");
|
||||||
|
if (tnodes != null) {
|
||||||
|
foreach (var link in tnodes) {
|
||||||
|
var href = link.GetAttributeValue("href", "");
|
||||||
|
if (!string.IsNullOrEmpty(href) && href.StartsWith("/archivio/Tutto/"))
|
||||||
|
tmpLk.Add(href); //tmpLk.Add(cLink_eRac.PageBase + href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Rimuove duplicati e ordina alfabeticamente
|
||||||
|
tmpLk = tmpLk
|
||||||
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
.Distinct() // elimina duplicati
|
||||||
|
.ToList();
|
||||||
|
// Inserisco i link trovati
|
||||||
|
foreach (string ilk in tmpLk) {
|
||||||
|
string url = cLink_eRac.PageBase + ilk;
|
||||||
|
int offset = int.Parse(ilk.Replace("/archivio/Tutto/", ""));
|
||||||
|
string name = $"_eRac_Idx_{offset.ToString("0000")}.html";
|
||||||
|
newlinks.Add(new cLink_eRac(url, name));
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.Error("Errore analisi Idx link dal " + FileName + " - " + ex.Message);
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnExtract, FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Estraggo gli url a racconti:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* I link ai racconti sono dei pulsanti così formati:
|
||||||
|
* <a class="rac" href="{URL}"></a>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
// Estraggo i link ai racconti:
|
||||||
|
tmpLk = new List<string>();
|
||||||
|
// Estraggo i link alle altre pagine:
|
||||||
|
var tnodes = tdoc.DocumentNode.SelectNodes("//a[@class='rac']");
|
||||||
|
if (tnodes != null) {
|
||||||
|
foreach (var link in tnodes) {
|
||||||
|
var href = link.GetAttributeValue("href", "");
|
||||||
|
if (!string.IsNullOrEmpty(href) && href.StartsWith("/racconto/"))
|
||||||
|
tmpLk.Add(href); //tmpLk.Add(cLink_eRac.PageBase + href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Rimuove duplicati e ordina alfabeticamente
|
||||||
|
tmpLk = tmpLk
|
||||||
|
.OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
.Distinct() // elimina duplicati
|
||||||
|
.ToList();
|
||||||
|
// Inserisco i link trovati
|
||||||
|
foreach (string ilk in tmpLk) {
|
||||||
|
string url = cLink_eRac.PageBase + ilk;
|
||||||
|
string name = ilk.Replace("/racconto/", "eRac_").Replace(@"/", "_") + ".html";
|
||||||
|
newlinks.Add(new cLink_eRac(url, name));
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.Error("Errore analisi Idx link dal " + FileName + " - " + ex.Message);
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnExtract, FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Estraggo il racconto dal file e lo inserisco nel DB
|
||||||
|
if (FileName.StartsWith("eRac_")) {
|
||||||
|
// Link ad un racconto
|
||||||
|
cRac rac = EstraiRac(tdoc);
|
||||||
|
if (rac != null) {
|
||||||
|
// Racconto estratto correttamente, lo salvo sul DB
|
||||||
|
int res = App.DB.ImportRac(rac);
|
||||||
|
if (res > 0) {
|
||||||
|
// Racconto salvato correttamente sul DB
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcDone, FileName);
|
||||||
|
} else {
|
||||||
|
// Errore nel salvataggio sul DB
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnSave, FileName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Estrazione del racconto fallita
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathSrcErrOnExtract, FileName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Link ad un indice
|
||||||
|
cTools.SaveToFile(thtml, Cfg.Settings.PathIdxDone, FileName);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
Status = eLinkState.End;
|
||||||
|
App.DB.LinkLog(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region End
|
||||||
|
if (Status == eLinkState.End) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Error
|
||||||
|
if (Status == eLinkState.Error) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Abort
|
||||||
|
if (Status == eLinkState.Abort) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Cancel
|
||||||
|
if (Status == eLinkState.Cancel) {
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
Console.WriteLine("Link.Count=" + newlinks.Count.ToString("00"));
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Console.WriteLine($"Errore con {URL}: {ex.Message}");
|
||||||
|
Status = eLinkState.Error;
|
||||||
|
App.DB.LinkLog(this);
|
||||||
|
}
|
||||||
|
return newlinks;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
}//class cLink_eRac
|
||||||
|
|
||||||
|
}//namespace A69WD.Net
|
||||||
@@ -47,6 +47,33 @@ namespace A69WD.Net {
|
|||||||
|
|
||||||
cRac EstraiRac(HtmlDocument doc);
|
cRac EstraiRac(HtmlDocument doc);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// #region Gestione Sito
|
||||||
|
//
|
||||||
|
// /// <summary>
|
||||||
|
// /// Booleano per sapere se siamo autenticati al sito
|
||||||
|
// /// (sempre true per i siti senza autenticazione)
|
||||||
|
// /// </summary>
|
||||||
|
// bool Autenticated { get; }
|
||||||
|
//
|
||||||
|
// /// <summary>
|
||||||
|
// /// Esegue l'autenticazione al sito
|
||||||
|
// /// </summary>
|
||||||
|
// Task<bool> Authenticate();
|
||||||
|
//
|
||||||
|
// /// <summary>
|
||||||
|
// /// Elaborazione della pagina linkata:
|
||||||
|
// /// Scarica il link e analizza quanto downloadato
|
||||||
|
// /// </summary>
|
||||||
|
// /// <param name="lk"></param>
|
||||||
|
// /// <returns></returns>
|
||||||
|
// Task<List<iLink>> CrawlPageAsync(iLink lk);
|
||||||
|
//
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
|
||||||
}//interface iLink
|
}//interface iLink
|
||||||
|
|
||||||
}//namespace A69WD.Net
|
}//namespace A69WD.Net
|
||||||
@@ -32,15 +32,100 @@ using System.Runtime.InteropServices;
|
|||||||
// È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build
|
// È 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:
|
// usando l'asterisco '*' come illustrato di seguito:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("0.5.0.0")]
|
[assembly: AssemblyVersion("0.5.3.2")]
|
||||||
[assembly: AssemblyFileVersion("0.5.0.0")]
|
[assembly: AssemblyFileVersion("0.5.3.2")]
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Vrs 0.5.3.2
|
||||||
|
*
|
||||||
|
* Compilata da CSiCoAlm il 2026/01/05
|
||||||
|
* - Update formattazione testi per eliminare problemi con accenti e caratteri html
|
||||||
|
* - Update formattazione tags per uniformare quelli di A69 e di Old_Milu
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Vrs 0.5.3.0
|
||||||
|
*
|
||||||
|
* Compilata da CSiCoAlm il 2026/01/02
|
||||||
|
* Inserito nello skraping anche la sorgente eRac
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Vrs 0.5.2.0
|
||||||
|
*
|
||||||
|
* Compilata da CSiCoAlm il 2026/01/01
|
||||||
|
* Refactoring del downloader per poterlo utilizzare in ATDB:
|
||||||
|
* - imglobata la classe iSite nella iLink
|
||||||
|
* - impostato cartelle di destinazione dei file per distinguere la diagnostica del lavoro
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Vrs 0.5.1.0
|
||||||
|
*
|
||||||
|
* Compilata da CSiCoAlm il 2026/01/01
|
||||||
|
* Refactoring del downloader per poterlo utilizzare in ATDB
|
||||||
|
* Upgradato l'importazione, selezionando casualmente i file da importare,
|
||||||
|
* gestendo il numero massimo di file e la cartella da importare, sul file di configurazione.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Vrs 0.5.0.0
|
* Vrs 0.5.0.0
|
||||||
*
|
*
|
||||||
* Compilata da CSiCoAlm il 2025/12/29
|
* Compilata da CSiCoAlm il 2025/12/31
|
||||||
* Inserito reader basilare (solo lettura, navigazione random o sequenziale)
|
* Inserito reader basilare (solo lettura, navigazione random o sequenziale)
|
||||||
* Integrato import e skraping sul reader
|
* Integrato import e skraping sul reader
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -8,7 +9,6 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using A69WD.Net;
|
using A69WD.Net;
|
||||||
using A69WD.Site;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -29,9 +29,6 @@ namespace A69WD.Service {
|
|||||||
private int _completati = 0;
|
private int _completati = 0;
|
||||||
private int _errori = 0;
|
private int _errori = 0;
|
||||||
|
|
||||||
// HttpClient autenticato (fornito da AuthService)
|
|
||||||
private iSiteType _site;
|
|
||||||
|
|
||||||
// Riferimenti ai controlli UI per aggiornare i contatori e la progress bar
|
// Riferimenti ai controlli UI per aggiornare i contatori e la progress bar
|
||||||
private readonly StatusStrip _sb;
|
private readonly StatusStrip _sb;
|
||||||
|
|
||||||
@@ -46,8 +43,7 @@ namespace A69WD.Service {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Avvia il thread worker che consuma la coda di URL.
|
/// Avvia il thread worker che consuma la coda di URL.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void StartWorker(iSiteType site) {
|
public void StartWorker() {
|
||||||
_site = site;
|
|
||||||
_workerThread = new Thread(ProcessQueue) { IsBackground = true };
|
_workerThread = new Thread(ProcessQueue) { IsBackground = true };
|
||||||
_workerThread.Start();
|
_workerThread.Start();
|
||||||
}
|
}
|
||||||
@@ -70,16 +66,38 @@ namespace A69WD.Service {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Thread worker: consuma la coda ed avvia task di download.
|
/// Thread worker: consuma la coda ed avvia task di download.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void ProcessQueue() {
|
private async void ProcessQueue() {
|
||||||
|
|
||||||
|
// Verifico cartelle di destinazione:
|
||||||
|
if (!Directory.Exists(Cfg.Settings.PathIdxDone)) Directory.CreateDirectory(Cfg.Settings.PathIdxDone);
|
||||||
|
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);
|
||||||
|
|
||||||
|
// Autenticazione ai siti:
|
||||||
|
if (!cLink_A69.Autenticated) { await cLink_A69.Authenticate(); }
|
||||||
|
if (!cLink_eRac.Autenticated) { await cLink_eRac.Authenticate(); }
|
||||||
|
|
||||||
|
// Ciclo per ciascun elemento della FIFO:
|
||||||
foreach (iLink link in _urlQueue.GetConsumingEnumerable()) {
|
foreach (iLink link in _urlQueue.GetConsumingEnumerable()) {
|
||||||
Logger.Information("ProcessQueue: Start url " + link.FileName);
|
Logger.Information("ProcessQueue: Start url " + link.FileName);
|
||||||
|
|
||||||
Task.Run(async () => {
|
Task.Run(async () => {
|
||||||
Interlocked.Increment(ref _inCorso);
|
Interlocked.Increment(ref _inCorso);
|
||||||
UpdateCounters();
|
UpdateCounters();
|
||||||
|
|
||||||
await _semaphore.WaitAsync();
|
await _semaphore.WaitAsync();
|
||||||
try {
|
try {
|
||||||
List<iLink> urls = await _site.CrawlPageAsync(link);
|
List<iLink> urls = null;
|
||||||
|
if (link is cLink_A69) {
|
||||||
|
cLink_A69 clk = link as cLink_A69;
|
||||||
|
urls = await clk.CrawlPageAsync();
|
||||||
|
} else {
|
||||||
|
if (link is cLink_eRac) {
|
||||||
|
cLink_eRac clk = link as cLink_eRac;
|
||||||
|
urls = await clk.CrawlPageAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
Logger.Information("ProcessQueue: end url " + link.FileName + " - URL trovati: " + urls.Count.ToString("000"));
|
Logger.Information("ProcessQueue: end url " + link.FileName + " - URL trovati: " + urls.Count.ToString("000"));
|
||||||
foreach (iLink url in urls) {
|
foreach (iLink url in urls) {
|
||||||
if (url.Validate) {
|
if (url.Validate) {
|
||||||
|
|||||||
@@ -0,0 +1,398 @@
|
|||||||
|
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<string> (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<cRac> 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<List<cRac>> EstraiRacs(string FileFullPath) {
|
||||||
|
/*
|
||||||
|
* Analisi file dei racconti Milu con il vecchio formato:
|
||||||
|
*
|
||||||
|
* - I file con un racconto valido hanno la seguente struttura:
|
||||||
|
*
|
||||||
|
* {...}
|
||||||
|
* <div id="pagetitle">
|
||||||
|
* <a href="viewstory.php?sid={IDrac}">{Titolo}</a>
|
||||||
|
* by
|
||||||
|
* <a href="viewuser.php?uid={IDaut}">{Autor}</a>
|
||||||
|
* </div>
|
||||||
|
* <div class="infobox">
|
||||||
|
* <div class="content">
|
||||||
|
* <span class="label">Summary: </span>{Riassunto}<br />
|
||||||
|
* <span class="label">Categories:</span>
|
||||||
|
* <a href='browse.php?type=categories&catid={IDcat}'>{categoria}</a>
|
||||||
|
* <span class="label">Characters: </span> {Characters}<br />
|
||||||
|
* <span class='label'>Genres: </span> {Genres}<br />
|
||||||
|
* <span class='label'>Warnings: </span> {Warnings}<br />
|
||||||
|
* <span class="label">Challenges:</span> {Challenges}<br />
|
||||||
|
* <span class="label">Series:</span> {Series}<br />
|
||||||
|
* <span class="label">Chapters: </span> {Chapters}
|
||||||
|
* <span class="label">Completed:</span> {Completed}
|
||||||
|
* <span class="label">Word count:</span> {WordCount}
|
||||||
|
* <span class="label">Read:</span> {Read}
|
||||||
|
* <span class="label"> Published: </span>{Published}
|
||||||
|
* <span class="label">Updated:</span> }Updated}
|
||||||
|
* </div>
|
||||||
|
* </div>
|
||||||
|
* <p><b>1.</b> <a href='#1'>{Tit1}</a> by {Autor}</p>
|
||||||
|
* <p><b>2.</b> <a href='#2'>{Tit2}</a> by {Autor}</p>
|
||||||
|
* <p><b>3.</b> <a href='#3'>{Tit3}</a> by {Autor}</p>
|
||||||
|
* <div class='chaptertitle'><a name='1'></a>{Tit1} by {Autor}</div>
|
||||||
|
* <div class='chapter'>{Trama1}</div>
|
||||||
|
* <div class='toplink'><a href='#1'>Torna all'indice</a></div>
|
||||||
|
* <div class='chaptertitle'><a name='2'></a>{Tit2} by {Autor}</div>
|
||||||
|
* <div class='chapter'>{Trama2}</div>
|
||||||
|
* <div class='toplink'><a href='#1'>Torna all'indice</a></div>
|
||||||
|
* <div class='chaptertitle'><a name='3'></a>{Tit3} by {Autor}</div>
|
||||||
|
* <div class='chapter'>{Trama3}</div>
|
||||||
|
* <div class='toplink'><a href='#1'>Torna all'indice</a></div>
|
||||||
|
* {...}
|
||||||
|
* <div id="archivedat">Questo racconto è attualmente archiviato su <a href="{URLrac}">{URLrac}</a></div>
|
||||||
|
*
|
||||||
|
* 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<cRac> racs = new List<cRac>();
|
||||||
|
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<string> origini = null;
|
||||||
|
List<string> tags = null;
|
||||||
|
List<cNota> notes = null;
|
||||||
|
string titolo = string.Empty;
|
||||||
|
string autore = string.Empty;
|
||||||
|
DateTime creato = DateTime.Now;
|
||||||
|
string infoCategories = string.Empty;
|
||||||
|
string infoPublished = string.Empty;
|
||||||
|
string infoCharacters = string.Empty;
|
||||||
|
string infoGenres = string.Empty;
|
||||||
|
string infoWarnings = string.Empty;
|
||||||
|
string infoChallenges = string.Empty;
|
||||||
|
string infoSeries = string.Empty;
|
||||||
|
string infoChapters = string.Empty;
|
||||||
|
string infoCompleted = string.Empty;
|
||||||
|
string infoWordCount = string.Empty;
|
||||||
|
string infoRead = string.Empty;
|
||||||
|
#region Info comuni a tutti i capitoli del racconto:
|
||||||
|
|
||||||
|
#region Origine
|
||||||
|
// Origine fissa:
|
||||||
|
origini = new List<string> { "Old Milu" };
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Titolo & Autore
|
||||||
|
// Titolo e autore si ricavano assieme: <div id="pagetitle"><a href="viewstory.php?sid={IDrac}">{Titolo}</a> by <a href="viewuser.php?uid={IDaut}">{Autor}</a></div>
|
||||||
|
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="infobox">< div class="content"><a href='browse.php?type=categories&catid={IDcat}'>{categoria}</a>
|
||||||
|
try {
|
||||||
|
nodes = root.SelectNodes("//div[@class='infobox']//div[@class='content']//a");
|
||||||
|
List<string> items = new List<string>();
|
||||||
|
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 = items
|
||||||
|
// .OrderBy(s => s) // ordina alfabeticamente
|
||||||
|
// .Distinct() // elimina duplicati
|
||||||
|
// .ToList();
|
||||||
|
cTools.Insert_Format_Tags(ref 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 & Notes
|
||||||
|
// Estraggo le informazioni generali
|
||||||
|
// Data estreatta dal testo del nodo <div class="infobox">< div class="content"> fra "Published{Published}Updated:
|
||||||
|
try {
|
||||||
|
HtmlNode nd = root.SelectSingleNode("//div[@class='infobox']//div[@class='content']");
|
||||||
|
string txt = nd.InnerText.Trim().Replace(" ", "");
|
||||||
|
infoPublished = TxtExtract(txt, "Published: ", "Updated: ");
|
||||||
|
infoCategories = TxtExtract(txt, "Categories:", "Characters:");
|
||||||
|
infoCharacters = TxtExtract(txt, "Characters:", "Genres:");
|
||||||
|
infoGenres = TxtExtract(txt, "Genres:", "Warnings:");
|
||||||
|
infoWarnings = TxtExtract(txt, "Warnings:", "Challenges:");
|
||||||
|
infoChallenges = TxtExtract(txt, "Challenges:", "Series:");
|
||||||
|
infoSeries = TxtExtract(txt, "Series:", "Chapters");
|
||||||
|
infoChapters = TxtExtract(txt, "Chapters:", "Completed");
|
||||||
|
infoCompleted = TxtExtract(txt, "Completed:", "Word count:");
|
||||||
|
infoWordCount = TxtExtract(txt, "Word count:", "Read:");
|
||||||
|
infoRead = TxtExtract(txt, "Read:", "Published:");
|
||||||
|
} catch (Exception ex) { Logger.Warning(string.Format("Informazioni generali non riconosciute nel file {0}\r\n{1}", filePathName, ex.Message)); return null; }
|
||||||
|
// Data del racconto
|
||||||
|
try {
|
||||||
|
CultureInfo culture = CultureInfo.CreateSpecificCulture("it-IT");
|
||||||
|
DateTimeStyles styles = DateTimeStyles.None;
|
||||||
|
if (!DateTime.TryParse(infoPublished.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; }
|
||||||
|
|
||||||
|
// Notes (comuni fra tutti i racconti):
|
||||||
|
try {
|
||||||
|
notes = new List<Data.cNota>();
|
||||||
|
notes.Add(new Data.cNota("SrcFile", System.IO.Path.GetFileName(filePathName)));
|
||||||
|
notes.Add(new Data.cNota("infoCategories", infoCategories));
|
||||||
|
notes.Add(new Data.cNota("infoCharacters", infoCharacters));
|
||||||
|
notes.Add(new Data.cNota("infoGenres", infoGenres));
|
||||||
|
notes.Add(new Data.cNota("infoWarnings", infoWarnings));
|
||||||
|
notes.Add(new Data.cNota("infoChallenges", infoChallenges));
|
||||||
|
notes.Add(new Data.cNota("infoSeries", infoSeries));
|
||||||
|
notes.Add(new Data.cNota("infoChapters", infoChapters));
|
||||||
|
notes.Add(new Data.cNota("infoCompleted", infoCompleted));
|
||||||
|
notes.Add(new Data.cNota("infoWordCount", infoWordCount));
|
||||||
|
notes.Add(new Data.cNota("infoRead", infoRead));
|
||||||
|
notes.Add(new Data.cNota("infoPublished", infoPublished));
|
||||||
|
} catch (Exception ex) { Logger.Warning(string.Format("Notes non riconosciute nel file {0}\r\n{1}", filePathName, ex.Message)); return null; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
// I vari capitoli dei racconti sono descritti dai nodi <div class='chaptertitle'> e <div class='chapter'> 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 = cTools.FormattaTesto(capTitles[i].InnerText.Trim().Replace($"by {autore}","").Trim(),true);
|
||||||
|
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<string>();
|
||||||
|
rac.Autori.Add(autore);
|
||||||
|
rac.Tags = tags;
|
||||||
|
rac.Origini = origini;
|
||||||
|
rac.Notes = notes;
|
||||||
|
// 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; }
|
||||||
|
|
||||||
|
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 string TxtExtract(string src, string start, string end) {
|
||||||
|
int nstart = src.LastIndexOf(start);
|
||||||
|
int nstop = src.LastIndexOf(end);
|
||||||
|
int offset = start.Length;
|
||||||
|
return src.Substring(nstart + offset, nstop - nstart - offset).Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}//class Service_Import_Milu
|
||||||
|
|
||||||
|
}//namespace A69WD.Service
|
||||||
@@ -8,7 +8,6 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using A69WD.Data;
|
using A69WD.Data;
|
||||||
using A69WD.Net;
|
using A69WD.Net;
|
||||||
using A69WD.Site;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -24,6 +23,7 @@ namespace A69WD.Service {
|
|||||||
// Contatori
|
// Contatori
|
||||||
private int _totali = 0;
|
private int _totali = 0;
|
||||||
private int _completati = 0;
|
private int _completati = 0;
|
||||||
|
private int _duplicati = 0;
|
||||||
private int _errori = 0;
|
private int _errori = 0;
|
||||||
|
|
||||||
public Service_Importer(StatusStrip sb) {
|
public Service_Importer(StatusStrip sb) {
|
||||||
@@ -43,12 +43,11 @@ namespace A69WD.Service {
|
|||||||
|
|
||||||
|
|
||||||
private async void ProcessWorking() {
|
private async void ProcessWorking() {
|
||||||
string[] files = System.IO.Directory.GetFiles(_path, "A69_*.html");
|
//string[] files = System.IO.Directory.GetFiles(_path, "A69_*.html");
|
||||||
_totali = files.Length;
|
//_totali = files.Length;
|
||||||
_completati = 0;
|
//_completati = 0;
|
||||||
_errori = 0;
|
//_errori = 0;
|
||||||
UpdateCounters();
|
//UpdateCounters();
|
||||||
|
|
||||||
// foreach (string file in files) {
|
// foreach (string file in files) {
|
||||||
// Task.Run(async () => {
|
// Task.Run(async () => {
|
||||||
// Logger.Warning($"Start estrazione racconto: {file}");
|
// Logger.Warning($"Start estrazione racconto: {file}");
|
||||||
@@ -72,7 +71,35 @@ namespace A69WD.Service {
|
|||||||
// });
|
// });
|
||||||
// }
|
// }
|
||||||
|
|
||||||
foreach (string file in files) {
|
// Seleziono 1000 file in modo casuale dalla directory indicata:
|
||||||
|
// - Ottieni tutti i file nel percorso
|
||||||
|
string[] files = System.IO.Directory.GetFiles(Cfg.Settings.PathImport, "A69_*.html");
|
||||||
|
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<string> (opzionale, ma utile)
|
||||||
|
|
||||||
|
// aggiorno contatori
|
||||||
|
_totali = fileCasuali.Count;
|
||||||
|
_completati = 0;
|
||||||
|
_duplicati = 0;
|
||||||
|
_errori = 0;
|
||||||
|
UpdateCounters();
|
||||||
|
|
||||||
|
// Verifico cartelle di destinazione
|
||||||
|
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);
|
string name = System.IO.Path.GetFileName(file);
|
||||||
Logger.Warning($"Import - Start estrazione racconto: {name}");
|
Logger.Warning($"Import - Start estrazione racconto: {name}");
|
||||||
|
|
||||||
@@ -80,27 +107,32 @@ namespace A69WD.Service {
|
|||||||
cRac rac = await lk.EstraiRac(file);
|
cRac rac = await lk.EstraiRac(file);
|
||||||
if (rac != null) {
|
if (rac != null) {
|
||||||
// Racconto estratto correttamente, lo salvo sul DB
|
// Racconto estratto correttamente, lo salvo sul DB
|
||||||
Logger.Warning($"Import - estrazione corretta: {name}");
|
Logger.Warning($"Import - estrazione corretta: {name}");
|
||||||
int res = App.DB.ImportRac(rac); // res=id del racconto nel DB
|
int res = App.DB.ImportRac(rac); // res=id del racconto nel DB
|
||||||
if (res < 1) {
|
if (res < 1) {
|
||||||
// errore nel salvataggio
|
// errore nel salvataggio
|
||||||
Logger.Warning($"Import - errore nel salvataggio: {name}");
|
Logger.Warning($"Import - errore nel salvataggio: {name}");
|
||||||
Interlocked.Increment(ref _errori);
|
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 {
|
} else {
|
||||||
// salvataggio ok
|
// salvataggio ok
|
||||||
Logger.Warning($"Import - racconto salvato: {name}");
|
Logger.Warning($"Import - racconto salvato: {name}");
|
||||||
Interlocked.Increment(ref _completati);
|
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 {
|
} else {
|
||||||
Logger.Warning($"Import - estrazione errata: {name}");
|
Logger.Warning($"Import - estrazione errata: {name}");
|
||||||
Interlocked.Increment(ref _errori);
|
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();
|
||||||
}
|
}
|
||||||
UpdateCounters();
|
UpdateCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void UpdateCounters() {
|
private void UpdateCounters() {
|
||||||
if (_sb.InvokeRequired) {
|
if (_sb.InvokeRequired) {
|
||||||
_sb.Invoke(new Action(UpdateCounters));
|
_sb.Invoke(new Action(UpdateCounters));
|
||||||
|
|||||||
@@ -6,6 +6,12 @@
|
|||||||
<!-- <PathApplicationRoot>C:\Temporary\A69WD</PathApplicationRoot> -->
|
<!-- <PathApplicationRoot>C:\Temporary\A69WD</PathApplicationRoot> -->
|
||||||
<PathApplicationRoot>C:\Commesse\_zPrivate\A69WD\Test</PathApplicationRoot>
|
<PathApplicationRoot>C:\Commesse\_zPrivate\A69WD\Test</PathApplicationRoot>
|
||||||
|
|
||||||
|
<!-- Path della cartella con i file da importare -->
|
||||||
|
<PathImport>C:\Commesse\_zPrivate\A69WD\Test\Import</PathImport>
|
||||||
|
|
||||||
|
<!-- Numero di file massimo da gestire. -->
|
||||||
|
<MaxNumFile>5</MaxNumFile>
|
||||||
|
|
||||||
<!-- Nome del database usato dall'applicazione. -->
|
<!-- Nome del database usato dall'applicazione. -->
|
||||||
<DBName>A69DB.db</DBName>
|
<DBName>A69DB.db</DBName>
|
||||||
|
|
||||||
|
|||||||
@@ -1,311 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using A69WD.Data;
|
|
||||||
using A69WD.Net;
|
|
||||||
using HtmlAgilityPack;
|
|
||||||
|
|
||||||
namespace A69WD.Site {
|
|
||||||
|
|
||||||
|
|
||||||
public class cSite_A69 : iSiteType {
|
|
||||||
|
|
||||||
private readonly HttpClient client;
|
|
||||||
private readonly string nickname = @"Toky78";
|
|
||||||
private readonly string password = @"p!fw05Q9Hc6j5";
|
|
||||||
private bool logged = false;
|
|
||||||
|
|
||||||
|
|
||||||
public bool Logged => logged;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Esegue l'autenticazione al sito:
|
|
||||||
/// - Scarica la pagina di autenticazione
|
|
||||||
/// - analizza quanto scaricato per determinare i campi dinamici 'ts' e 'token'
|
|
||||||
/// - prepara la risposta al form di identificazione
|
|
||||||
/// - invia il POST di autenticazione
|
|
||||||
/// - analizza la risposta per virificare il corretto login
|
|
||||||
/// </summary>
|
|
||||||
public async Task<bool> Authenticate() {
|
|
||||||
try {
|
|
||||||
// 1) GET pagina di login
|
|
||||||
Console.WriteLine("A69 - Richiedo la pagina di login...");
|
|
||||||
string loginPageHtml = await client.GetStringAsync(cLink_A69.LoginPageUrl);
|
|
||||||
|
|
||||||
// 2) Parsing HTML per estrarre ts e token
|
|
||||||
var doc = new HtmlAgilityPack.HtmlDocument();
|
|
||||||
doc.LoadHtml(loginPageHtml);
|
|
||||||
|
|
||||||
string ts = doc.DocumentNode
|
|
||||||
.SelectSingleNode("//input[@name='ts']")
|
|
||||||
?.GetAttributeValue("value", "");
|
|
||||||
string token = doc.DocumentNode
|
|
||||||
.SelectSingleNode("//input[@name='token']")
|
|
||||||
?.GetAttributeValue("value", "");
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(ts) || string.IsNullOrWhiteSpace(token)) {
|
|
||||||
Console.WriteLine("A69 - Impossibile estrarre 'ts' o 'token' dalla pagina di login.");
|
|
||||||
return logged;
|
|
||||||
}
|
|
||||||
Console.WriteLine($"A69 - Parametri dinamici trovati: ts={ts}, token={token}");
|
|
||||||
|
|
||||||
// 3) POST login con valori dinamici
|
|
||||||
var loginData = new FormUrlEncodedContent(new[]
|
|
||||||
{
|
|
||||||
new KeyValuePair<string,string>("nick", nickname),
|
|
||||||
new KeyValuePair<string,string>("pwd", password),
|
|
||||||
new KeyValuePair<string,string>("ricordami","1"),
|
|
||||||
new KeyValuePair<string,string>("login", "Entra"),
|
|
||||||
new KeyValuePair<string,string>("ts", ts),
|
|
||||||
new KeyValuePair<string,string>("token", token)
|
|
||||||
});
|
|
||||||
|
|
||||||
Console.WriteLine("Invio credenziali di login...");
|
|
||||||
var loginResponse = await client.PostAsync(cLink_A69.LoginPostUrl, loginData);
|
|
||||||
|
|
||||||
if (!loginResponse.IsSuccessStatusCode) {
|
|
||||||
Console.WriteLine($"A69 - Login fallito. HTTP {(int)loginResponse.StatusCode} {loginResponse.ReasonPhrase}");
|
|
||||||
return logged;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verifica semplice: sulla pagina di login effettuato, ricerco il nome dell'utente:
|
|
||||||
string loginResult = await loginResponse.Content.ReadAsStringAsync();
|
|
||||||
if (loginResult.Contains(nickname)) {
|
|
||||||
Console.WriteLine("A69 - Login effettuato con successo! Sessione autenticata attiva.");
|
|
||||||
logged = true;
|
|
||||||
} else {
|
|
||||||
Console.WriteLine("A69 - Login non riuscito: il server ha restituito un messaggio di errore.");
|
|
||||||
logged = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Console.WriteLine($"Errore generale: {ex.Message}");
|
|
||||||
}
|
|
||||||
return logged;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Codice da eseguire per ciascun A69 link:
|
|
||||||
/// - scarico l'url indicato
|
|
||||||
/// - se richiesto lo salvo come file di testo
|
|
||||||
/// - analizzo il documento html ed estraggo tutti gli url ad altre pagine di link
|
|
||||||
/// - analizzo il documento html ed estraggo tutti gli url a racconti
|
|
||||||
/// - analizzo il documento html ed estraggo il testo del racconto
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="lk"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<List<iLink>> CrawlPageAsync(iLink lk) {
|
|
||||||
var newlinks = new List<iLink>();
|
|
||||||
try {
|
|
||||||
Console.WriteLine($"A69 - Scarico: {lk.URL}");
|
|
||||||
HtmlDocument tdoc = null;
|
|
||||||
|
|
||||||
#region ToConfirm
|
|
||||||
//if (lk.Status == eLinkState.ToConfirm) {
|
|
||||||
// // Eseguo la verifica se link da downloadare
|
|
||||||
// eLinkState tstate = App.DB.GetStateByURL(lk.URL);
|
|
||||||
// if (
|
|
||||||
// (tstate == eLinkState.ToConfirm) ||
|
|
||||||
// (tstate == eLinkState.ToDownload) ||
|
|
||||||
// (tstate == eLinkState.Error)
|
|
||||||
// ) {
|
|
||||||
// lk.Status = eLinkState.ToDownload;
|
|
||||||
// App.DB.LinkLog(lk);
|
|
||||||
// } else {
|
|
||||||
// lk.Status = eLinkState.End;
|
|
||||||
// App.DB.LinkLog(lk);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
if (lk.Status == eLinkState.ToConfirm) {
|
|
||||||
// Eseguo la verifica se link da downloadare
|
|
||||||
lk.Status = eLinkState.ToDownload;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ToDownload
|
|
||||||
if (lk.Status == eLinkState.ToDownload) {
|
|
||||||
lk.Status = eLinkState.OnDownload;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region OnDownload
|
|
||||||
if (lk.Status == eLinkState.OnDownload) {
|
|
||||||
// Scarico il file
|
|
||||||
var resp = await client.GetAsync(lk.URL);
|
|
||||||
if (!resp.IsSuccessStatusCode) {
|
|
||||||
Console.WriteLine($"A69 - Errore HTTP {(int)resp.StatusCode} {resp.ReasonPhrase} per {lk.URL}");
|
|
||||||
lk.Status = eLinkState.Error;
|
|
||||||
//App.DB.LinkLog(lk);
|
|
||||||
return newlinks;
|
|
||||||
}
|
|
||||||
// Scarico la pagina
|
|
||||||
var thtml = await client.GetStringAsync(lk.URL);
|
|
||||||
tdoc = new HtmlDocument();
|
|
||||||
tdoc.LoadHtml(thtml);
|
|
||||||
// Salvo il file downloadato
|
|
||||||
//System.IO.StreamWriter tsw = new System.IO.StreamWriter(lk.DstFilePath, false, Encoding.UTF8);
|
|
||||||
System.IO.StreamWriter tsw = new System.IO.StreamWriter(System.IO.Path.Combine(lk.FilePath, lk.FileName), false, Encoding.UTF8);
|
|
||||||
tsw.Write(thtml);
|
|
||||||
|
|
||||||
lk.Status = eLinkState.ToAnalize;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ToAnalize
|
|
||||||
{
|
|
||||||
if (lk.Status == eLinkState.ToAnalize) {
|
|
||||||
List<string> tmpLk = new List<string>();
|
|
||||||
#region Estraggo gli url ad indici:
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Gli url delle pagine di indice sono del tipo:
|
|
||||||
*
|
|
||||||
* <div id="pagination">
|
|
||||||
* <ul>
|
|
||||||
* <li class="prev"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=2">‹</a></li>
|
|
||||||
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=1">1</a></li>
|
|
||||||
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=2">2</a></li>
|
|
||||||
* <li class="currentpage">3</li>
|
|
||||||
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=4">4</a></li>
|
|
||||||
* <li class="page"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=5">5</a></li>
|
|
||||||
* <li class="next"><a href="/racconti-erotici/racconti_lista.php?genere=altro&pagina=4">›</a></li>
|
|
||||||
* </ul>
|
|
||||||
* </div>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
// Estraggo i link alle altre pagine:
|
|
||||||
var tnodes = tdoc.DocumentNode.SelectNodes("//div[@id='pagination']//ul//li//a[@href]");
|
|
||||||
if (tnodes != null) {
|
|
||||||
foreach (var link in tnodes) {
|
|
||||||
var href = link.GetAttributeValue("href", "");
|
|
||||||
if (!string.IsNullOrEmpty(href) && href.StartsWith("/racconti-erotici/racconti_lista.php?genere="))
|
|
||||||
tmpLk.Add(href); //tmpLk.Add(cLink_A69.PageBase + href);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Rimuove duplicati e ordina alfabeticamente
|
|
||||||
tmpLk = tmpLk
|
|
||||||
.OrderBy(s => s) // ordina alfabeticamente
|
|
||||||
.Distinct() // elimina duplicati
|
|
||||||
.ToList();
|
|
||||||
// Inserisco i link trovati
|
|
||||||
try {
|
|
||||||
foreach (string ilk in tmpLk) {
|
|
||||||
string[] separator = new string[] { "&pagina=" };
|
|
||||||
string[] txt = ilk.Split(separator, StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
string url = cLink_A69.PageBase + ilk;
|
|
||||||
string name = txt[0].Replace("/racconti-erotici/racconti_lista.php?genere=", "_A69_") + "_" + int.Parse(txt[1]).ToString("0000") + ".html";
|
|
||||||
newlinks.Add(new cLink_A69(url, name));
|
|
||||||
}
|
|
||||||
} catch (Exception ex) { Logger.Error("Errore analisi Idx link dal " + lk.FileName + " - " + ex.Message); }
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Estraggo gli url a racconti:
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* I link ai racconti sono dei pulsanti così formati:
|
|
||||||
* <div class="continua">
|
|
||||||
* <a href="/racconti-erotici/altro/Tutto-e-iniziato-per-gioco-pazza-famiglia_166770.html">Continua a leggere » </a>
|
|
||||||
* </div>
|
|
||||||
*/
|
|
||||||
// Estraggo i link ai racconti:
|
|
||||||
tmpLk = new List<string>();
|
|
||||||
// Estraggo i link alle altre pagine:
|
|
||||||
var tnodes = tdoc.DocumentNode.SelectNodes("//div[@class='continua']//a[@href]");
|
|
||||||
if (tnodes != null) {
|
|
||||||
foreach (var link in tnodes) {
|
|
||||||
var href = link.GetAttributeValue("href", "");
|
|
||||||
if (!string.IsNullOrEmpty(href) && href.StartsWith("/racconti-erotici/") && (href.EndsWith(".html") || href.EndsWith(".htm")))
|
|
||||||
tmpLk.Add(href); //tmpLk.Add(cLink_A69.PageBase + href);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Rimuove duplicati e ordina alfabeticamente
|
|
||||||
tmpLk = tmpLk
|
|
||||||
.OrderBy(s => s) // ordina alfabeticamente
|
|
||||||
.Distinct() // elimina duplicati
|
|
||||||
.ToList();
|
|
||||||
// Inserisco i link trovati
|
|
||||||
try {
|
|
||||||
foreach (string ilk in tmpLk) {
|
|
||||||
string url = cLink_A69.PageBase + ilk;
|
|
||||||
string name = ilk.Replace("/racconti-erotici/", "A69_").Replace(@"/","_");
|
|
||||||
newlinks.Add(new cLink_A69(url, name));
|
|
||||||
}
|
|
||||||
} catch (Exception ex) { Logger.Error("Errore analisi Idx link dal " + lk.FileName + " - " + ex.Message); }
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Estraggo il racconto dal file e lo inserisco nel DB
|
|
||||||
if (lk.FileName.StartsWith("A69_")) {
|
|
||||||
// Link ad un racconto
|
|
||||||
cRac rac = lk.EstraiRac(tdoc);
|
|
||||||
if (rac != null) {
|
|
||||||
// Racconto estratto correttamente, lo salvo sul DB
|
|
||||||
App.DB.ImportRac(rac);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
lk.Status = eLinkState.End;
|
|
||||||
App.DB.LinkLog(lk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region End
|
|
||||||
if (lk.Status == eLinkState.End) {
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Error
|
|
||||||
if (lk.Status == eLinkState.Error) {
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Abort
|
|
||||||
if (lk.Status == eLinkState.Abort) {
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Cancel
|
|
||||||
if (lk.Status == eLinkState.Cancel) {
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
Console.WriteLine("Link.Count=" + newlinks.Count.ToString("00"));
|
|
||||||
|
|
||||||
} catch (Exception ex) {
|
|
||||||
Console.WriteLine($"Errore con {lk.URL}: {ex.Message}");
|
|
||||||
lk.Status = eLinkState.Error;
|
|
||||||
//App.DB.LinkLog(lk);
|
|
||||||
}
|
|
||||||
return newlinks;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public cSite_A69() {
|
|
||||||
var handler = new HttpClientHandler {
|
|
||||||
CookieContainer = new CookieContainer(),
|
|
||||||
UseCookies = true,
|
|
||||||
AllowAutoRedirect = true,
|
|
||||||
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
|
|
||||||
};
|
|
||||||
|
|
||||||
client = new HttpClient(handler);
|
|
||||||
client.Timeout = TimeSpan.FromSeconds(60);
|
|
||||||
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
|
|
||||||
client.DefaultRequestHeaders.Referrer = new Uri(cLink_A69.LoginPageUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}//class cSite_A69
|
|
||||||
|
|
||||||
}//namespace A69WD.Site
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using A69WD.Net;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Interfaccia iSiteType
|
|
||||||
* ---------------------
|
|
||||||
* Questa interfaccia definisce il contratto per le diverse tipologie di siti gestiti dal crawler.
|
|
||||||
* Ogni sito deve implementare:
|
|
||||||
* - Authenticate(): eventuale autenticazione al sito (PUT, POST, ecc.)
|
|
||||||
* - ValidateLink(string href): regole di validazione dei link estratti
|
|
||||||
* - CrawlPageAsync(string url): scarica una pagina e la analizza
|
|
||||||
*
|
|
||||||
* In questo modo il programma principale può distinguere facilmente tra siti autenticati e pubblici,
|
|
||||||
* mantenendo il codice modulare ed estensibile.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace A69WD.Site {
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interfaccia per gestire le operazioni da fare su un sito
|
|
||||||
/// </summary>
|
|
||||||
public interface iSiteType {
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Booleano per sapere se siamo autenticati al sito
|
|
||||||
/// (sempre true per i siti senza autenticazione)
|
|
||||||
/// </summary>
|
|
||||||
bool Logged { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Esegue l'autenticazione al sito
|
|
||||||
/// </summary>
|
|
||||||
Task<bool> Authenticate();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Elaborazione della pagina linkata:
|
|
||||||
/// Scarica il link e analizza quanto downloadato
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="lk"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<iLink>> CrawlPageAsync(iLink lk);
|
|
||||||
|
|
||||||
}//interface iSiteType
|
|
||||||
|
|
||||||
}//namespace A69WD.Site
|
|
||||||
Generated
+83
-6
@@ -28,7 +28,14 @@
|
|||||||
this.sbMessage = new System.Windows.Forms.ToolStripStatusLabel();
|
this.sbMessage = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.sbProgressBar = new System.Windows.Forms.ToolStripProgressBar();
|
this.sbProgressBar = new System.Windows.Forms.ToolStripProgressBar();
|
||||||
this.sbStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
|
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.sb.SuspendLayout();
|
||||||
|
this.pnlTop.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// rtb
|
// rtb
|
||||||
@@ -37,10 +44,10 @@
|
|||||||
this.rtb.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
this.rtb.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
this.rtb.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.rtb.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.rtb.Font = new System.Drawing.Font("Verdana", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
this.rtb.Font = new System.Drawing.Font("Verdana", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.rtb.Location = new System.Drawing.Point(0, 0);
|
this.rtb.Location = new System.Drawing.Point(0, 42);
|
||||||
this.rtb.Name = "rtb";
|
this.rtb.Name = "rtb";
|
||||||
this.rtb.Size = new System.Drawing.Size(700, 420);
|
this.rtb.Size = new System.Drawing.Size(700, 378);
|
||||||
this.rtb.TabIndex = 3;
|
this.rtb.TabIndex = 2;
|
||||||
this.rtb.Text = "";
|
this.rtb.Text = "";
|
||||||
this.rtb.KeyDown += new System.Windows.Forms.KeyEventHandler(this.KeyDownAnalisi);
|
this.rtb.KeyDown += new System.Windows.Forms.KeyEventHandler(this.KeyDownAnalisi);
|
||||||
//
|
//
|
||||||
@@ -54,7 +61,7 @@
|
|||||||
this.sb.Location = new System.Drawing.Point(0, 420);
|
this.sb.Location = new System.Drawing.Point(0, 420);
|
||||||
this.sb.Name = "sb";
|
this.sb.Name = "sb";
|
||||||
this.sb.Size = new System.Drawing.Size(700, 24);
|
this.sb.Size = new System.Drawing.Size(700, 24);
|
||||||
this.sb.TabIndex = 2;
|
this.sb.TabIndex = 1;
|
||||||
this.sb.Text = "statusStrip1";
|
this.sb.Text = "statusStrip1";
|
||||||
//
|
//
|
||||||
// sbMessage
|
// sbMessage
|
||||||
@@ -64,7 +71,7 @@
|
|||||||
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
|
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
|
||||||
this.sbMessage.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
|
this.sbMessage.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner;
|
||||||
this.sbMessage.Name = "sbMessage";
|
this.sbMessage.Name = "sbMessage";
|
||||||
this.sbMessage.Size = new System.Drawing.Size(452, 19);
|
this.sbMessage.Size = new System.Drawing.Size(483, 19);
|
||||||
this.sbMessage.Spring = true;
|
this.sbMessage.Spring = true;
|
||||||
this.sbMessage.Tag = "Messaggi";
|
this.sbMessage.Tag = "Messaggi";
|
||||||
this.sbMessage.Text = "Messaggi";
|
this.sbMessage.Text = "Messaggi";
|
||||||
@@ -90,6 +97,69 @@
|
|||||||
this.sbStatusLabel.Tag = "Label";
|
this.sbStatusLabel.Tag = "Label";
|
||||||
this.sbStatusLabel.ToolTipText = "Stato di eventuali operazioni in background";
|
this.sbStatusLabel.ToolTipText = "Stato di eventuali operazioni in background";
|
||||||
//
|
//
|
||||||
|
// btnTest1
|
||||||
|
//
|
||||||
|
this.btnTest1.Location = new System.Drawing.Point(11, 5);
|
||||||
|
this.btnTest1.Name = "btnTest1";
|
||||||
|
this.btnTest1.Size = new System.Drawing.Size(99, 32);
|
||||||
|
this.btnTest1.TabIndex = 4;
|
||||||
|
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);
|
||||||
|
this.pnlTop.Name = "pnlTop";
|
||||||
|
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
|
// frmReader
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
@@ -97,6 +167,7 @@
|
|||||||
this.ClientSize = new System.Drawing.Size(700, 444);
|
this.ClientSize = new System.Drawing.Size(700, 444);
|
||||||
this.ControlBox = false;
|
this.ControlBox = false;
|
||||||
this.Controls.Add(this.rtb);
|
this.Controls.Add(this.rtb);
|
||||||
|
this.Controls.Add(this.pnlTop);
|
||||||
this.Controls.Add(this.sb);
|
this.Controls.Add(this.sb);
|
||||||
this.Name = "frmReader";
|
this.Name = "frmReader";
|
||||||
this.Text = "PlugIn_App_Reader.UI Reader (DB vrs1.3, App" +
|
this.Text = "PlugIn_App_Reader.UI Reader (DB vrs1.3, App" +
|
||||||
@@ -104,6 +175,7 @@
|
|||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmReader_FormClosing);
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmReader_FormClosing);
|
||||||
this.sb.ResumeLayout(false);
|
this.sb.ResumeLayout(false);
|
||||||
this.sb.PerformLayout();
|
this.sb.PerformLayout();
|
||||||
|
this.pnlTop.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -115,6 +187,11 @@
|
|||||||
private System.Windows.Forms.ToolStripStatusLabel sbMessage;
|
private System.Windows.Forms.ToolStripStatusLabel sbMessage;
|
||||||
private System.Windows.Forms.ToolStripProgressBar sbProgressBar;
|
private System.Windows.Forms.ToolStripProgressBar sbProgressBar;
|
||||||
private System.Windows.Forms.ToolStripStatusLabel sbStatusLabel;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+95
-21
@@ -11,7 +11,6 @@ using System.Windows.Forms;
|
|||||||
using A69WD.Data;
|
using A69WD.Data;
|
||||||
using A69WD.Net;
|
using A69WD.Net;
|
||||||
using A69WD.Service;
|
using A69WD.Service;
|
||||||
using A69WD.Site;
|
|
||||||
|
|
||||||
namespace A69WD.UI {
|
namespace A69WD.UI {
|
||||||
public partial class frmReader : Form {
|
public partial class frmReader : Form {
|
||||||
@@ -23,7 +22,6 @@ namespace A69WD.UI {
|
|||||||
|
|
||||||
private Service_Crawler serviceCrawler = null;
|
private Service_Crawler serviceCrawler = null;
|
||||||
private Service_Importer ServiceImporter = null;
|
private Service_Importer ServiceImporter = null;
|
||||||
A69WD.Site.iSiteType siteA69 = null;
|
|
||||||
|
|
||||||
public frmReader() {
|
public frmReader() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -54,6 +52,7 @@ namespace A69WD.UI {
|
|||||||
mImp.MenuItems.Add(mImpStop);
|
mImp.MenuItems.Add(mImpStop);
|
||||||
// Menu contestuale:
|
// Menu contestuale:
|
||||||
this.ContextMenu = new ContextMenu();
|
this.ContextMenu = new ContextMenu();
|
||||||
|
this.ContextMenu.MenuItems.Add(new MenuItem("View Log", MenuItem_ShowLog_Click, Shortcut.None));
|
||||||
this.ContextMenu.MenuItems.Add(mSkr);
|
this.ContextMenu.MenuItems.Add(mSkr);
|
||||||
this.ContextMenu.MenuItems.Add(mImp);
|
this.ContextMenu.MenuItems.Add(mImp);
|
||||||
// Enable only start
|
// Enable only start
|
||||||
@@ -62,6 +61,10 @@ namespace A69WD.UI {
|
|||||||
mImpStart.Enabled = true;
|
mImpStart.Enabled = true;
|
||||||
mImpStop.Enabled = false;
|
mImpStop.Enabled = false;
|
||||||
|
|
||||||
|
// TEST // Update UI
|
||||||
|
// TEST pnlTop.Enabled = false;
|
||||||
|
// TEST pnlTop.Visible = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -675,34 +678,25 @@ namespace A69WD.UI {
|
|||||||
mImpStart.Enabled = false;
|
mImpStart.Enabled = false;
|
||||||
mImpStop.Enabled = false;
|
mImpStop.Enabled = false;
|
||||||
|
|
||||||
// - Creo istanza del client per il sito con autenticazione:
|
|
||||||
sbStatusLabel.Text = "Login on A69";
|
|
||||||
siteA69 = new cSite_A69();
|
|
||||||
|
|
||||||
// - Eseguo l'autenticazione
|
|
||||||
bool res = await siteA69.Authenticate();
|
|
||||||
if (res) {
|
|
||||||
sbStatusLabel.Text = "A69 logged";
|
|
||||||
Logger.Information("Sito A69 loggato: " + res.ToString());
|
|
||||||
} else {
|
|
||||||
Logger.Information("Login Fault");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - Verifico path per il download
|
// - Verifico path per il download
|
||||||
if (!System.IO.Directory.Exists(Cfg.Settings.PathDownloadWorking)) System.IO.Directory.CreateDirectory(Cfg.Settings.PathDownloadWorking);
|
if (!System.IO.Directory.Exists(Cfg.Settings.PathDownloadWorking)) System.IO.Directory.CreateDirectory(Cfg.Settings.PathDownloadWorking);
|
||||||
|
|
||||||
// Preparo il servizio
|
// Preparo il servizio
|
||||||
serviceCrawler = new Service_Crawler(sb);
|
serviceCrawler = new Service_Crawler(sb);
|
||||||
// Inserisco i link iniziali nella coda
|
// Inserisco i link iniziali nella coda
|
||||||
|
if (!cLink_eRac.InsertStartLink(serviceCrawler)) {
|
||||||
|
Logger.Warning("eRac - Insert start link Fault");
|
||||||
|
sbStatusLabel.Text = "eRac fault.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!cLink_A69.InsertStartLink(serviceCrawler)) {
|
if (!cLink_A69.InsertStartLink(serviceCrawler)) {
|
||||||
|
Logger.Warning("A69 - Insert start link Fault");
|
||||||
sbStatusLabel.Text = "A69 fault.";
|
sbStatusLabel.Text = "A69 fault.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// avvio il servizio
|
// avvio il servizio
|
||||||
serviceCrawler.StartWorker(siteA69);
|
serviceCrawler.StartWorker();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuItem_Skraping_Stop_Click(object sender, EventArgs e) {
|
void MenuItem_Skraping_Stop_Click(object sender, EventArgs e) {
|
||||||
// Update menu
|
// Update menu
|
||||||
mSkrStart.Enabled = false;
|
mSkrStart.Enabled = false;
|
||||||
@@ -712,7 +706,6 @@ namespace A69WD.UI {
|
|||||||
|
|
||||||
if (serviceCrawler != null) { serviceCrawler.StopWorker(); }
|
if (serviceCrawler != null) { serviceCrawler.StopWorker(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuItem_Importer_Start_Click(object sender, EventArgs e) {
|
void MenuItem_Importer_Start_Click(object sender, EventArgs e) {
|
||||||
// Update menu
|
// Update menu
|
||||||
mSkrStart.Enabled = false;
|
mSkrStart.Enabled = false;
|
||||||
@@ -724,13 +717,94 @@ namespace A69WD.UI {
|
|||||||
ServiceImporter = new Service_Importer(sb);
|
ServiceImporter = new Service_Importer(sb);
|
||||||
|
|
||||||
// Per ora uso la directory di default, poi metteremo selezione
|
// Per ora uso la directory di default, poi metteremo selezione
|
||||||
string path = Cfg.Settings.PathDownloadWorking;
|
string path = Cfg.Settings.PathImport;
|
||||||
|
|
||||||
// avvio il servizio
|
// avvio il servizio
|
||||||
ServiceImporter.StartWorker(path);
|
ServiceImporter.StartWorker(path);
|
||||||
|
|
||||||
}
|
}
|
||||||
void MenuItem_Importer_Stop_Click(object sender, EventArgs e) {; }
|
void MenuItem_Importer_Stop_Click(object sender, EventArgs e) {
|
||||||
|
// Update menu
|
||||||
|
mSkrStart.Enabled = false;
|
||||||
|
mSkrStop.Enabled = false;
|
||||||
|
mImpStart.Enabled = false;
|
||||||
|
mImpStop.Enabled = false;
|
||||||
|
|
||||||
|
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 serializzazione su file xml
|
||||||
|
|
||||||
|
// - Verifico path per il download
|
||||||
|
if (!System.IO.Directory.Exists(Cfg.Settings.PathDownloadWorking)) System.IO.Directory.CreateDirectory(Cfg.Settings.PathDownloadWorking);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
ServiceImportMilu.StartWorker(path);
|
||||||
|
}
|
||||||
|
Service_Import_Milu ServiceImportMilu = null;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user