benvenuto nel mondo del c sharp


se posso esserti d'aiuto (al momento ho implementato fino all'ultima versione delle tue api), sono qui.
Moderatore: Moderatore ADB
Codice: Seleziona tutto
public class ADBService<T> where T : class {
/// <summary>
/// Numero di versione della funzione, utile per controllare se sono state fatte modifiche rispetto a quanto restituito la volta prima.
/// Cercherò di mantenere la compatibilità con il passato e quindi le modifiche saranno probabilmente solo nuovi parametri in ingresso o
/// aggiunte di dati in output.
/// </summary>
[JsonPropertyName("release")]
public int Release { get; set; }
/// <summary>
/// Contiene i dati della funzione specifica e possono variare anche sensibilmente (vedere sotto per maggiorni informazioni).
/// </summary>
[JsonPropertyName("result")]
public List<T> Result { get; set; } = new List<T>();
public bool IsEmpty => Result != null && Result.Count > 0;
public T FirstOrDefault() => Result?.FirstOrDefault();
public static ADBService<T> GetData(string url, string parameters = "") {
WebBrowser browser = new WebBrowser();
string result = browser.Request(url + parameters);
if (result == null) {
return null;
}
//return JsonDocument.Parse(result, new JsonConverter<ADBService<T>>(;
return JsonSerializer.Deserialize<ADBService<T>>(result);
}
}
Codice: Seleziona tutto
/// <summary>
/// URL
/// http://adb.arcadeitalia.net/service_scraper.php?ajax=query_mame
///
/// PARAMETRI DI INPUT
/// game_name(string) Romset da cercare, sono ammessi valori multipli separati da punto e virgola.
/// Es. "mslug", "mslug;mslug2;atetris"
///
/// use_parent(bool) Opzionale, indica se leggere i dati dal parent se il gioco è un clone e non ha info.
/// Il controllo è fatto per singola risorsa, quindi può capitare uno snap del gioco ed un marquee del parent.
/// Valori:
/// 0=No (default), 1=Sì
///
/// resize(string) Opzionale, indica il ridimensionamento di tutte le immagini ad una determinata risoluzione:
/// Valori:
/// 0 - immagine originale(default)
/// 100 oppure 100h - scala a 100px in altezza
/// 200 oppure 200h - scala a 200px in altezza
/// 300 oppure 300h - scala a 300px in altezza
/// 100w - scala a 100px in larghezza
/// 200w - scala a 200px in larghezza
/// 300w - scala a 300px in larghezza
/// Ogni altro valore è ignorato ed ha come effetto un resize a 200px in altezza.
/// L'aspect ratio viene mantenuto e si utilizza un filtro Lanczos per l'operazione, che viene effettuata al volo(richiede tempo cpu aggiuntivo).
///
/// lang(it|en) Opzionale, indica la lingua da utilizzare per le traduzioni di alcuni termini(es.per il genere).
/// Normalmente meglio non specificare il parametro ed impostare l'header del browser.
/// Dopo la prima chiamata tale valore viene salvato nei cookies e rappresenterà il default per le successive richieste.
///
/// Esempio di chiamate:
/// Dati Tetris:
/// http://adb.arcadeitalia.net/service_scraper.php?ajax=query_mame&game_name=atetris
/// Dati Tetris e Metal Slug:
/// http://adb.arcadeitalia.net/service_scraper.php?ajax=query_mame&game_name=atetris;mslug
/// Dati Metal Slug 2 clone con controllo parent:
/// http://adb.arcadeitalia.net/service_scraper.php?ajax=query_mame&game_name=mslug2t&use_parent=1
/// Dati Tetris e Metal Slug 2 con resize immaginni a 300px verticali:
/// http://adb.arcadeitalia.net/service_scraper.php?ajax=query_mame&game_name=atetris;mslug&resize=300h
///
/// </summary>
public class MameResult {
public const string URL = "http://adb.arcadeitalia.net/service_scraper.php?ajax=query_mame&";
/// <summary>
/// Numero progressivo, inizia da 1
/// </summary>
[JsonPropertyName("index")]
public int Index { get; set; } = 0;
/// <summary>
/// Url per informazioni dettagliate del gioco
/// </summary>
[JsonPropertyName("url")]
public string Url { get; set; } = string.Empty;
/// <summary>
/// Romset del gioco
/// Es. mslug, atetris
/// </summary>
[JsonPropertyName("game_name")]
public string GameName { get; set; } = string.Empty;
/// <summary>
/// Titolo del gioco.
/// Es. Metal Slug, Tetris (set 1)
/// </summary>
[JsonPropertyName("title")]
public string Title { get; set; } = string.Empty;
/// <summary>
/// Romset del gioco parent, se presente
/// </summary>
[JsonPropertyName("cloneof")]
public string CloneOf { get; set; } = string.Empty;
/// <summary>
/// Produttore
/// </summary>
[JsonPropertyName("manufacturer")]
public string Manufacturer { get; set; } = string.Empty;
/// <summary>
/// Url di download dello snapshot ingame in formato png, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// </summary>
[JsonPropertyName("url_image_ingame")]
public string UrlImageIngame { get; set; } = string.Empty;
/// <summary>
/// Url di download del titolo in formato png, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// </summary>
[JsonPropertyName("url_image_title")]
public string UrlImageTitle { get; set; } = string.Empty;
/// <summary>
/// Url di download del marquee in formato png, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// </summary>
[JsonPropertyName("url_image_marquee")]
public string UrlImageMarquee { get; set; } = string.Empty;
/// <summary>
/// Url di download del cabinet in formato png, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// </summary>
[JsonPropertyName("url_image_cabinet")]
public string UrlImageCabinet { get; set; } = string.Empty;
/// <summary>
/// Url di download del volantino in formato png, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// </summary>
[JsonPropertyName("url_image_flyer")]
public string UrlImageFlyer { get; set; } = string.Empty;
/// <summary>
/// Url di download dell'icona in formato ico, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// [Release 2]
/// </summary>
[JsonPropertyName("url_icon")]
public string UrlIcon { get; set; } = string.Empty;
/// <summary>
/// Genere del gioco dai file categoria. Es. Picchiaduro, Guida, ecc.
/// </summary>
[JsonPropertyName("genre")]
public string Genre { get; set; } = string.Empty;
/// <summary>
/// Numero di giocatori gestiti dal gioco
/// </summary>
[JsonPropertyName("players")]
public int Players { get; set; } = 0;
/// <summary>
/// Anno di uscita del gioco. Può contenere simboli per indicare date non certe
/// Es. 19??
/// </summary>
[JsonPropertyName("year")]
public string Year { get; set; } = string.Empty;
/// <summary>
/// Stato emulazione del driver.
/// Valori: GOOD, IMPERFECT, PRELIMINARY, TEST, UNKNOWN
/// </summary>
[JsonPropertyName("status")]
public string Status { get; set; } = STATUS.UNKNOWN.ToString();
public enum STATUS {
GOOD,
IMPERFECT,
PRELIMINARY,
TEST,
UNKNOWN
}
/// <summary>
/// Mame history da www.arcade-history.com oppure progettoemma.net.
/// Sono presenti due voci di copyright(una lunga ed una corta) ed è necessario mostrare uno dei due contenuti da qualche parte,
/// per es.subito sotto al testo
/// </summary>
[JsonPropertyName("history")]
public string History { get; set; } = string.Empty;
/// <summary>
/// Mame history da www.arcade-history.com oppure progettoemma.net.
/// Sono presenti due voci di copyright(una lunga ed una corta) ed è necessario mostrare uno dei due contenuti da qualche parte,
/// per es.subito sotto al testo
/// </summary>
[JsonPropertyName("history_copyright_long")]
public string HistoryCopyrightLong { get; set; } = string.Empty;
/// <summary>
/// Mame history da www.arcade-history.com oppure progettoemma.net.
/// Sono presenti due voci di copyright(una lunga ed una corta) ed è necessario mostrare uno dei due contenuti da qualche parte,
/// per es.subito sotto al testo
/// </summary>
[JsonPropertyName("history_copyright_short")]
public string HistoryCopyrightShort { get; set; } = string.Empty;
/// <summary>
/// ID del video su Youtube (verifica sul parent se use_parent=1)
/// Si possono aggiungere link diretti o embedded in questo modo:
/// https://www.youtube.com/watch?v=XXXXXX
/// https://www.youtube.com/embed/XXXXXX?autoplay=1
/// </summary>
[JsonPropertyName("youtube_video_id")]
public string YoutubeVideoId { get; set; } = string.Empty;
public string UrlYoutubeVideo => string.IsNullOrEmpty(YoutubeVideoId) ? string.Empty : $"https://www.youtube.com/watch?v={YoutubeVideoId}";
public string UrlYoutubeEmbededVideo => string.IsNullOrEmpty(YoutubeVideoId) ? string.Empty : $"https://www.youtube.com/embed/{YoutubeVideoId}?autoplay=1";
/// <summary>
/// Url per scaricare il video, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// NOTA: Il video è in formato mp4 (h.264 + aac) a risoluzione nativa del gioco.
/// </summary>
[JsonPropertyName("url_video_shortplay")]
public string UrlVideoShortplay { get; set; } = string.Empty;
/// <summary>
/// Url per scaricare il video in 1080p, vuoto se non presente
/// Verifica sul parent se use_parent=1
/// NOTA: Il video è in formato mp4(h.264 + aac) a risoluzione scalata fino a 1080p verticale.
/// Il ridimensionamento avviene durante la conversione della partita dal file raw per ottenere la massima qualità possibile.
/// </summary>
[JsonPropertyName("url_video_shortplay_hd")]
public string UrlVideoShortplayHD { get; set; } = string.Empty;
/// <summary>
/// Identificativo unico dell'emulatore all'interno del sito (id).
/// Può essere usato per capire se ci sono stati aggiornamenti dall'ultima lettura.
/// </summary>
[JsonPropertyName("emulator_id")]
public int EmulatorId { get; set; } = 0;
/// <summary>
/// Nome e release dell'emulatore
/// Es. "Mame 0.189 (30-ago-2017)"
/// </summary>
[JsonPropertyName("emulator_name")]
public string EmulatorName { get; set; } = string.Empty;
/// <summary>
/// Lingue supportate separate da virgola
/// Valori: Brazilian Portuguese, Chinese, Croatian, Dutch, English, French, German, Greek,
/// Hungarian, Italian, Japanese, Korean, Polish, Russian, Slovak, Spanish, Swedish, Czech
/// Potrebbero aggiungersene altri in futuro.
/// </summary>
[JsonPropertyName("languages")]
public string Languages { get; set; } = string.Empty;
/// <summary>
/// Voto medio del gioco come indicato sul sito. Può assumere valori da 0 (nessun voto) a 100 (voto massimo) con step di una unità.
/// </summary>
[JsonPropertyName("rate")]
public int Rate { get; set; } = 0;
/// <summary>
/// Nome semplificato del gioco, senza i dati tra parentesi ed altri dettagli
/// Verifica sul parent se use_parent=1
/// 21/06/2020 - Release 3
/// </summary>
[JsonPropertyName("short_title")]
public string ShortTitle { get; set; } = string.Empty;
/// <summary>
/// Modalità di gioco e numeri di giocatori, da nplayers.ini (Nomax)
/// Verifica sul parent se use_parent=1
/// 16/08/2020 - Release 4
/// </summary>
[JsonPropertyName("nplayers")]
public string NPlayers { get; set; } = string.Empty;
/// <summary>
/// Tipo di input, da gamelist.xml del Mame
/// Verifica sul parent se use_parent=1
/// 16/08/2020 - Release 4
/// </summary>
[JsonPropertyName("input_controls")]
public string InputControls { get; set; } = string.Empty;
/// <summary>
/// Numero di pulsanti, da gamelist.xml del Mame
/// Verifica sul parent se use_parent=1
/// 15/05/2021 - Release 5
/// </summary>
[JsonPropertyName("input_buttons")]
public int InputButtons { get; set; } = 0;
/// <summary>
/// Colori ed etichette dei pulsanti, da colors.ini (headkaze) e controls.xml (SirPoonga)
/// Il formato è "controllo1:colore1:etichetta1;controllo2:colore2:etichetta2;..." (verifica sul parent se use_parent = 1)
/// 16/08/2020 - Release 4
/// </summary>
[JsonPropertyName("buttons_colors")]
public string ButtonsColors { get; set; } = string.Empty;
/// <summary>
/// Nome della serie, da series.ini (ProgettoSnaps)
/// 15/05/2021 - Release 5
/// </summary>
[JsonPropertyName("serie")]
public string Serie { get; set; } = string.Empty;
/// <summary>
/// Tipo di orientamento dello schermo
/// Valori supportati: Horizontal, Vertical
/// 15/05/2021 - Release 5
/// </summary>
[JsonPropertyName("screen_orientation")]
public string ScreenOrientation { get; set; } = SCREEN_ORIENTATION.Horizontal.ToString();
public enum SCREEN_ORIENTATION {
Horizontal,
Vertical
}
/// <summary>
/// Risoluzione, frequenza e rotazione dello schermo
/// Il formato è "larghezzaxaltezzapx @frequenzaHz Rangolo, ..."
/// Verifica sul parent se use_parent = 1
/// Alcuni valori potrebbero non essere indicati, ad esempio R0 è implicito e vuol dire che non ci sono
/// rotazioni dello schermo.Nel caso di più schermi, si avranno altri dati separati da una virgola.
/// Es. "256x224px @60Hz R270", "336x240px @59,922743Hz", "320x224px @59,185606Hz"
/// 15/05/2021 - Release 5
/// </summary>
[JsonPropertyName("screen_resolution")]
public string ScreenResolution { get; set; } = string.Empty;
}
Codice: Seleziona tutto
// Download info Mame da ADB
WebBrowser browser = new WebBrowser();
foreach (ES_Game game in system.Games) {
index++;
OperationStatus($"[{index}/{system.Games.Count}] INFO {game.Name}");
ADBService<MameResult> data = ADBService<MameResult>.GetData(
MameResult.URL,
"&game_name=" + Utility.EscapeUrlParameter(game.BaseFilename) +
"&use_parent=1"
);
game.MameInfo = data.FirstOrDefault();
if (game.MameInfo == null) {
continue;
}
if (!string.IsNullOrEmpty(game.MameInfo.Genre)) {
game.Genre = game.MameInfo.Genre;
}
if (!string.IsNullOrEmpty(game.MameInfo.Title)) {
game.Name = game.MameInfo.Title;
}
if (!string.IsNullOrEmpty(game.MameInfo.History)) {
game.Description = game.MameInfo.History;
}
if (!string.IsNullOrEmpty(game.MameInfo.Manufacturer)) {
game.Publisher = game.MameInfo.Manufacturer;
}
if (game.MameInfo.Rate > 0) {
game.Rating = game.MameInfo.Rate;
}
if (game.MameInfo.Players > 0) { // TODO: forse meglio Nplayers?
if (game.MameInfo.Players == 1) {
game.Players = "1 player";
} else {
game.Players = $"{game.MameInfo.Players} players";
}
}
if (!string.IsNullOrEmpty(game.MameInfo.Year)) { // TODO: forse meglio Nplayers?
int.TryParse(game.MameInfo.Year, out int anno);
if (anno > 0) {
game.ReleaseDate = new DateTime(anno, 1, 1);
} else {
game.ReleaseDate = null;
}
}
// Download immagine
if (!game.ImageFileExists && !string.IsNullOrEmpty(game.MameInfo.UrlImageIngame)) {
OperationStatus($"[{index}/{system.Games.Count}] IMAGE {game.Name}");
game.Image = $"./images/{game.BaseFilename}.png";
string fname = game.GetImageFilename(basePath);
if (!File.Exists(fname)) {
browser.DownloadFileAsync(game.MameInfo.UrlImageIngame, fname);
browser.WaitForDownload();
}
game.ImageFileExists = true;
}
// Download video
if (!game.VideoFileExists && !string.IsNullOrEmpty(game.MameInfo.UrlVideoShortplay)) {
OperationStatus($"[{index}/{system.Games.Count}] VIDEO {game.Name}");
game.Video = $"./videos/{game.BaseFilename}.mp4";
string fname = game.GetVideoFilename(basePath);
if (!File.Exists(fname)) {
browser.DownloadFileAsync(game.MameInfo.UrlVideoShortplay, fname);
browser.WaitForDownload();
}
game.VideoFileExists = true;
}
}
Codice: Seleziona tutto
QueryMameRequest request = new QueryMameRequest() {
GameNames = new List<string>() { game.BaseFilename },
UseParent = true
};
ADBService<QueryMameResult> data = ADBService<QueryMameResult>.GetData(request.URL);
if (data == null) continue;
Codice: Seleziona tutto
public class QueryMameRequest : IADBServiceRequest {
public const string PAGE_URL = "http://adb.arcadeitalia.net/service_scraper.php";
public const string PAGE_METHOD = "query_mame";
public string URL {
get {
string parameters = string.Empty;
if (GameNames != null && GameNames.Count > 0) {
parameters = "&game_name=" + Utility.EscapeUrlParameter(string.Join(";", GameNames));
}
parameters += $"&use_parent={(UseParent ? "1" : "0")}";
return $"{PAGE_URL}?ajax={PAGE_METHOD}{parameters}";
}
}
/// <summary>
/// Numero progressivo, inizia da 1
/// </summary>
[JsonPropertyName("game_name")]
public List<string> GameNames { get; set; }
/// <summary>
/// Url per informazioni dettagliate del gioco
/// </summary>
[JsonPropertyName("use_parent")]
public bool UseParent { get; set; } = false;
}
effettivametne questa cosa è interessantemotoschifo ha scritto: ↑07/08/2021, 11:50 È una DownloadString di Webclient, ma in questo caso più parlante (per me).
Ho anche dovuto fare l'override di Webclient standard perchè non si poteva impostare un timeout, che va bene per cose piccole ma se il server impiega troppo tempo non hai modo di portare a termine l'operazione.