public Official(StandardTitle title) { var config = new ConfigurationBuilder() .SetBasePath(System.IO.Directory.GetCurrentDirectory()) //From NuGet Package Microsoft.Extensions.Configuration.Json .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); var servicesProvider = DeezerSync.Log.Logging.BuildDi(config); using (servicesProvider as IDisposable) { log = servicesProvider.GetRequiredService <NLogger>(); } this.title = title; if (title.search_stage == 0) { log.Debug("Send Request with Artist: " + title.artist ?? title.username + " Track: " + title.title + " Duration: " + title.duration); Request_Query = Official_api + "artist:" + "\"" + WebUtility.UrlEncode(title.artist.Trim() ?? title.username.Trim()) + "\" " + "track:" + "\"" + WebUtility.UrlEncode(title.title.Trim()); } else { if (title.search_stage == 1) { log.Debug("Send Request with Artist: " + title.artist ?? title.username + " Track: " + title.title + " Duration: " + title.duration); Request_Query = Official_api + "artist:" + "\"" + WebUtility.UrlEncode(title.artist.Trim() ?? title.username.Trim()) + "\" " + "track:" + "\"" + WebUtility.UrlEncode(title.title.Trim()) + "\" " + "dur_min:" + (title.duration - 1).ToString() ?? "0" + " dur_max:" + (title.duration + 1).ToString() ?? "999"; } if (title.search_stage == 2) { if (title.isRemix) { log.Debug("Send Request with Remix Artist: " + title.remixArtist ?? title.username + " Track: " + title.title + " Duration: " + title.duration); Request_Query = Official_api + "artist:" + "\"" + WebUtility.UrlEncode(title.remixArtist.Trim() ?? title.artist.Trim() ?? title.username.Trim()) + "\" " + "track:" + "\"" + WebUtility.UrlEncode(title.title.Trim()) + "\" " + "dur_min:" + (title.duration - 1).ToString() ?? "0" + " dur_max:" + (title.duration + 1).ToString() ?? "999"; } else { log.Debug("Send Request with Artist: " + title.artist ?? title.username + " Track: " + title.title + " Duration: " + title.duration); Request_Query = Official_api + "artist:" + "\"" + WebUtility.UrlEncode(title.artist.Trim() ?? title.username.Trim()) + "\" " + "track:" + "\"" + WebUtility.UrlEncode(title.title.Trim()) + "\" " + "dur_min:" + (title.duration - 1).ToString() ?? "0" + " dur_max:" + (title.duration + 1).ToString() ?? "999"; } } else { if (title.search_stage == 3) { log.Debug("Send Request with Track: " + title.artist ?? title.username + " " + title.title); Request_Query = Official_api + WebUtility.UrlEncode(title.artist.Trim() ?? title.username.Trim() + " " + title.title.Trim()); } } } }
/// <summary> /// Execute the Deezer Search Query /// </summary> /// <param name="query">Prepared StandardTitel Object</param> /// <returns></returns> protected async Task <List <StandardTitle> > ExecuteQuery(StandardTitle query) { try { /* * Deezer Private API * * DeezerAPI.Private api = new DeezerAPI.Private(); * if (query.isRemix) * { * return await api.SearchQuery(query.username + " " + query.title + " " + query.labelname); * } * return await api.SearchQuery(query.username + " " + query.title); */ // Deezer Public API DeezerAPI.Official api = new DeezerAPI.Official(query); ResultSearch.Search res = await api.Search(); log.Info("Found " + res.Data.Count + " Tracks"); if (res.Data.Count > 0) { List <StandardTitle> tracks = new List <StandardTitle>(); Prepare p = new Prepare(); foreach (var i in res.Data) { tracks.Add(await p.PrepareDeezerQuery(new StandardTitle { description = string.Empty, duration = (int)i.Duration, genre = string.Empty, id = i.Id.Value, labelname = string.Empty, search_stage = 0, title = i.Title, username = i.Artist.Name, artist = i.Artist.Name, url = i.Link.AbsoluteUri })); } return(tracks); } return(new List <StandardTitle>()); } catch (Exception e) { log.Warning("Search Query Exception: " + e.Message, e); return(new List <StandardTitle>()); } }
/// <summary> /// Remove special chars to improve seach results /// </summary> /// <param name="input">StandardTitel Object</param> /// <returns></returns> public async Task <StandardTitle> PrepareDeezerQuery(StandardTitle input) { // Remove unsearchable Char if (input.title.Contains("&")) { log.Debug("Remove '&' from Title " + input.title); input.title = Regex.Replace(input.title, "&", "", RegexOptions.IgnoreCase).Trim(); } if (input.username.Contains("&")) { log.Debug("Remove '&' from Artist" + input.username); input.username = Regex.Replace(input.username, "&", "", RegexOptions.IgnoreCase); } // Remix Detection + Set Remix Artist as label if (Regex.Match(input.title, @"Remix", RegexOptions.IgnoreCase).Success) { log.Info(input.title + " is Remix"); input.isRemix = true; Match m = Regex.Match(input.title, @"(\(|\[).*Remix*(\)|\])", RegexOptions.IgnoreCase); if (m.Success) { // Split track replace remix entry with the clean remix artist string regex = Regex.Replace(input.title, @"(\(|\[).*Remix*(\)|\])", m.Value, RegexOptions.IgnoreCase).Trim(); // Set Remix Artist as new Artist input.remixArtist = Regex.Replace(m.Value, @"[\(*\)|\[*\]]", "", RegexOptions.IgnoreCase).Trim(); input.remixArtist = Regex.Replace(input.remixArtist, @"Remix", "", RegexOptions.IgnoreCase).Trim(); log.Debug("Set Remix Artist " + input.remixArtist + " as new main Artist " + input.username + " (labelname)"); // Remove remaining [] () input.title = Regex.Replace(regex, @"(\(.*\)|\[.*\])", "", RegexOptions.IgnoreCase).Trim(); input.title = Regex.Replace(input.title, @"&", "", RegexOptions.IgnoreCase).Trim(); log.Debug("New Title is: " + input.title); } else { input.title = Regex.Replace(input.title, @"(\(.*\)|\[.*\])", "", RegexOptions.IgnoreCase).Trim(); input.title = Regex.Replace(input.title, @"&", "", RegexOptions.IgnoreCase).Trim(); log.Debug("New Title is: " + input.title); } } else { input.title = Regex.Replace(input.title, @"(\(.*\)|\[.*\])", "", RegexOptions.IgnoreCase).Trim(); input.title = Regex.Replace(input.title, @"&", "", RegexOptions.IgnoreCase).Trim(); log.Debug("New Title is: " + input.title); } // Remove unsearchable chars if (input.title.Contains("<") && input.title.Contains(">")) { log.Debug("Remove '< >' from Title"); input.title = Regex.Replace(input.title, @"(<.*>)", "", RegexOptions.IgnoreCase).Trim(); } // Remove artist name in titel Match cleanTitel = Regex.Match(input.title, @"\s(-)\s", RegexOptions.IgnoreCase); if (input.title.Contains(input.username)) { if (cleanTitel.Success) { log.Debug("Remove same Artist from Titel"); string[] tmp = Regex.Split(input.title, @"\s(-)\s", RegexOptions.IgnoreCase); input.artist = tmp[0].Trim(); input.title = tmp[2].Trim(); } } else { if (cleanTitel.Success) { log.Debug("Remove Artist from Title"); string[] tmp = Regex.Split(input.title, @"\s(-)\s", RegexOptions.IgnoreCase); input.title = tmp[2].Trim(); // Check if contains two whitespaces can come from an previeous char removal if (Regex.Match(tmp[0], @"\s\s", RegexOptions.IgnoreCase).Success) { string[] art = Regex.Split(tmp[0], @"\s\s", RegexOptions.IgnoreCase); input.artist = art[0].Trim(); } else { input.artist = tmp[0].Trim(); } } } log.Debug("Prepared Serach Query is Artist: " + input.username + " Titel: " + input.title); return(input); }
/// <summary> /// Check Search result for the right Track /// </summary> /// <param name="results">Deezer Query Results</param> /// <param name="Searching">The Track to search for</param> /// <returns></returns> public async Task <long> search(List <StandardTitle> results, StandardTitle Searching) { #if DEBUG /* * int i = 0; * do { i++; } while (File.Exists(Directory.GetCurrentDirectory() + "\\results\\" + i + ".json")); * Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\results\\"); * await File.WriteAllTextAsync(Directory.GetCurrentDirectory() + "\\results\\" + i+".json", JsonConvert.SerializeObject(new DebugResult { Searching = Searching, Results = results }, Formatting.Indented)); */ #endif foreach (var result in results) { /* * DeezerSync Result Search Filter * Results 369 out of 1593 * False Positives UNKNOWN */ /* * if (await checkDuration(Searching.duration, result.duration, 1)) * { * if (!string.IsNullOrEmpty(result.remixArtist)) * { * if ((result.artist.Contains(Searching.artist ?? (Searching.remixArtist ?? Searching.username)) || result.remixArtist.Contains(Searching.remixArtist ?? (Searching.artist ?? Searching.title)) || (result.title.Contains(Searching.artist ?? (Searching.remixArtist ?? Searching.username)) || (result.title.Contains(Searching.remixArtist ?? (Searching.artist ?? Searching.username))))) && (result.title.Contains(Searching.title))) * { * await SavePreparedData(results, Searching, result); * return result.id; * } * } * else * { * if ((result.artist.Contains(Searching.artist ?? (Searching.remixArtist ?? Searching.username)) || (result.title.Contains(Searching.artist ?? (Searching.remixArtist ?? Searching.username)) || (result.title.Contains(Searching.remixArtist ?? (Searching.artist ?? Searching.username))))) && (result.title.Contains(Searching.title))) * { * await SavePreparedData(results, Searching, result); * return result.id; * } * } * if ( result.artist.Contains(Searching.artist ?? Searching.remixArtist ?? Searching.username) || result.title.Contains(Searching.title) && await checkDuration(Searching.duration, result.duration, 0)) * { * await SavePreparedData(results, Searching, result); * return result.id; * } * } */ /* * DeezerSync Result Search Filter * Results 722 songs out of 1593 * False positives > 30 */ //Remix Artist if (!string.IsNullOrEmpty(Searching.remixArtist)) { if ((result.artist.Contains(Searching.remixArtist, StringComparison.OrdinalIgnoreCase) && result.title.Equals(Searching.title, StringComparison.OrdinalIgnoreCase))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if ((result.artist.Contains(Searching.remixArtist, StringComparison.OrdinalIgnoreCase) && result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if ((result.artist.Contains(Searching.remixArtist, StringComparison.OrdinalIgnoreCase) || result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase)) && await checkDuration(Searching.duration, result.duration, 2)) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if (result.artist.Contains(Searching.remixArtist, StringComparison.OrdinalIgnoreCase) && result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase)) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if ((result.title.Contains(Searching.remixArtist, StringComparison.OrdinalIgnoreCase) && (result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase)))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } } // if Result song is Remix but Searching Song isnt if (!Searching.isRemix) { if (result.isRemix) { continue; } } if (Searching.isRemix) { if (!result.isRemix) { continue; } } //Artist if (!string.IsNullOrEmpty(result.artist)) { if ((result.artist.Contains(Searching.artist ?? Searching.username, StringComparison.OrdinalIgnoreCase) && result.title.Equals(Searching.title, StringComparison.OrdinalIgnoreCase))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if ((result.artist.Contains(Searching.artist ?? Searching.username, StringComparison.OrdinalIgnoreCase) && result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if (result.artist.Contains(Searching.artist ?? Searching.username, StringComparison.OrdinalIgnoreCase) && result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase)) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } } //Username if ((result.username.Contains(Searching.username, StringComparison.OrdinalIgnoreCase) && result.title.Equals(Searching.title, StringComparison.OrdinalIgnoreCase))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if ((result.username.Contains(Searching.username, StringComparison.OrdinalIgnoreCase) && result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase))) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.username + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if ((result.username.Contains(Searching.username, StringComparison.OrdinalIgnoreCase) || result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase)) && await checkDuration(Searching.duration, result.duration, 0)) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.username + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if (result.username.Contains(Searching.username, StringComparison.OrdinalIgnoreCase) && result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase)) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.username + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } if (result.title.Contains(Searching.title, StringComparison.OrdinalIgnoreCase) && await checkDuration(Searching.duration, result.duration, 0)) { await SavePreparedData(results, Searching, result); log.Info("Found Song Artist: " + result.artist + " Track: " + result.title + " https://www.deezer.com/us/track/" + result.id); return(result.id); } log.Info("Could not find Track: " + result.title + " Artist: " + result.artist ?? result.username + "Original Track: " + Searching.title + " Artist: " + Searching.artist ?? Searching.username); } return(0); }
private async Task SavePreparedData(List <StandardTitle> titles, StandardTitle searched, StandardTitle reported) { //await File.WriteAllTextAsync(@"../../../../../DataAnalytics/PreparedData/SearchResults/" + searched.id + "-" + System.Guid.NewGuid() + ".json", JsonConvert.SerializeObject(new DebugResult { Searching = searched, Results = titles, Reported = reported }, Formatting.Indented)); }
/// <summary> /// Add Track to Database /// </summary> /// <param name="data">Track Object</param> /// <returns></returns> public async Task addTrack(StandardTitle data) { var input = db.GetCollection <StandardTitle>(data.title.Normalize().Replace(" ", "_", StringComparison.InvariantCultureIgnoreCase)); await input.InsertOneAsync(data); }