using Microsoft.Extensions.Logging; using Roadie.Library.Caching; using Roadie.Library.Configuration; using Roadie.Library.Encoding; using Roadie.Library.MetaData.LastFm; using Roadie.Library.Models.Users; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using data = Roadie.Library.Data; namespace Roadie.Library.Scrobble { /// /// Handles NowPlaying and Scrobbling for all integrations /// public class ScrobbleHandler : IScrobbleHandler { private IRoadieSettings Configuration { get; } private data.IRoadieDbContext DbContext { get; } private ILogger Logger { get; } private IHttpEncoder HttpEncoder { get; } private IEnumerable Scrobblers { get; } public ScrobbleHandler(IRoadieSettings configuration, ILogger logger, data.IRoadieDbContext dbContext, ICacheManager cacheManager, IHttpEncoder httpEncoder) { Logger = logger; Configuration = configuration; DbContext = dbContext; HttpEncoder = httpEncoder; var scrobblers = new List { new RoadieScrobbler(configuration, logger, dbContext, cacheManager) }; if (configuration.Integrations.LastFmProviderEnabled) { scrobblers.Add(new LastFmHelper(configuration, cacheManager, logger, dbContext, httpEncoder)); } Scrobblers = scrobblers; } /// /// Send Now Playing Requests /// public async Task> NowPlaying(User user, ScrobbleInfo scrobble) { var s = GetScrobbleInfoDetails(scrobble); foreach (var scrobbler in Scrobblers) { await Task.Run(async () => await scrobbler.NowPlaying(user, s)); } return new OperationResult { Data = true, IsSuccess = true }; } /// /// Send any Scrobble Requests /// public async Task> Scrobble(User user, ScrobbleInfo scrobble) { var s = GetScrobbleInfoDetails(scrobble); foreach (var scrobbler in Scrobblers) { await Task.Run(async () => await scrobbler.Scrobble(user, s)); } return new OperationResult { Data = true, IsSuccess = true }; } private ScrobbleInfo GetScrobbleInfoDetails(ScrobbleInfo scrobble) { var scrobbleInfo = (from t in this.DbContext.Tracks join rm in this.DbContext.ReleaseMedias on t.ReleaseMediaId equals rm.Id join r in this.DbContext.Releases on rm.ReleaseId equals r.Id join a in this.DbContext.Artists on r.ArtistId equals a.Id where t.RoadieId == scrobble.TrackId select new { ArtistName = a.Name, ReleaseTitle = r.Title, TrackTitle = t.Title, t.TrackNumber, t.Duration }).FirstOrDefault(); scrobble.ArtistName = scrobbleInfo.ArtistName; scrobble.ReleaseTitle = scrobbleInfo.ReleaseTitle; scrobble.TrackTitle = scrobbleInfo.TrackTitle; scrobble.TrackNumber = scrobbleInfo.TrackNumber.ToString(); scrobble.TrackDuration = TimeSpan.FromMilliseconds((double)(scrobbleInfo.Duration ?? 0)); return scrobble; } } }