ADB-Tools

Il database che raccoglie tutte le informazioni sui giochi, video, screenshot e tanto altro ancora

Moderatore: Moderatore ADB

Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4847
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: ADB-Tools

Messaggio da Gothrek »

@motoschifo
benvenuto nel mondo del c sharp :D e di vs2019 :D

se posso esserti d'aiuto (al momento ho implementato fino all'ultima versione delle tue api), sono qui.
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: ADB-Tools

Messaggio da motoschifo »

Beh diciamo che VS non l'ho mai abbandonato, specialmente per lavoro, ma a casa non avevo aggiornato da tempo perchè non erano uscite cose interessanti da integrare.
Ora invece con la versione 2019 inizia ad esserci qualche miglioria utile, specialmente tutto il discorso blazor (e comunque anche la parte di C# con tutte le caratteristiche speciali del linguaggio che semplificano la lettura del codice).

Per ora ho creato la classe sulla base della stessa struttura php, inclusi i commenti.

Se può tornarti utile ecco come ho fatto io:

ADBService.cs

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);
		}
	}


MameResult.cs:

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;

	}


Parte relativa alla chiamata:

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;
					}
				}
Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: ADB-Tools

Messaggio da motoschifo »

Manca volendo una tipizzazione di T, basta anche un'interfaccia vuota, e qualche metodo per accodare più chiamate ed usare intervalli di attesa random per evitare di saturare il server.
Ma l'ho fatto di getto, in realtà non avevo previsto di chiamare in quel modo però ho visto che in poche ore sono riuscito senza problemi a scriverla e provarla.
Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: ADB-Tools

Messaggio da motoschifo »

Già che c'ero, con poche righe in più ho tipizzato anche il filtro di input così non mi preoccupo di caratteri strani ed è tutto più leggibile.

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;

	}

Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4847
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: ADB-Tools

Messaggio da Gothrek »

@motoschifo

sicuramente torna utile avere le classi di chi ha creato il servizio :D
il 2019 ha portato un bel pò di novità, chiaramente parlo per la mia "area di competenza" form based, e seppur si possa sempre dire, ma io i programmi li scrivevo lo stesso anche con notepad, il mondo di oggi che va sempre di fretta e vuole creare con velocità ne ha bisogno.
tutte le semplificazioni e gli aiuti nello scrivere codice e, seppur in minima parte, verificarlo, aiutano in tutto questo
Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4847
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: ADB-Tools

Messaggio da Gothrek »

@motoschifo
motoschifo ha scritto: 03/08/2021, 18:39 string result = browser.Request(url + parameters);
ma questa request?
Avatar utente
motoschifo

Gold Medal Donatore
Progetto Arcade Database
Progetto Arcade Database
Messaggi: 3271
Iscritto il: 12/07/2013, 20:29
Medaglie: 2
Città: Parma
Località: Parma
Grazie Inviati: 32 volte
Grazie Ricevuti: 31 volte
Contatta:

Re: ADB-Tools

Messaggio da motoschifo »

È 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.
Motoschifo
CAB ›MameOriz ›MameVert ›PCB ›NeoGeo ›TopDrive ›Tekken3 Wishlist ›PacMan ›Arkanoid
Flipper ›HighSpeed Wishlist ›MedievalMadness ›MonsterBash ›HighSpeed2 WebArcadeDatabase
Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4847
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: ADB-Tools

Messaggio da Gothrek »

motoschifo 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.
effettivametne questa cosa è interessante
Avatar utente
Myazgan
Newbie
Newbie
Messaggi: 14
Iscritto il: 09/06/2021, 16:26
Città: roma
Grazie Inviati: 2 volte

Re: ADB-Tools

Messaggio da Myazgan »

Grande!!!! Grazie 1000.
Rispondi

Torna a “Progetto Arcade Data Base”