1using System;
2using System.Collections.Generic;
3using System.Linq;
4using Lidarr.Api.V1.Albums;
5using Lidarr.Http;
6using Lidarr.Http.Extensions;
7using Microsoft.AspNetCore.Mvc;
8using NzbDrone.Common.Extensions;
9using NzbDrone.Core.ArtistStats;
10using NzbDrone.Core.DecisionEngine.Specifications;
11using NzbDrone.Core.MediaCover;
12using NzbDrone.Core.Music;
13using NzbDrone.Core.Tags;
14using NzbDrone.SignalR;
15
16namespace Lidarr.Api.V1.Calendar
17{
18 [V1ApiController]
19 public class CalendarController : AlbumControllerWithSignalR
20 {
21 private readonly IArtistService _artistService;
22 private readonly ITagService _tagService;
23
24 public CalendarController(IAlbumService albumService,
25 IArtistService artistService,
26 IArtistStatisticsService artistStatisticsService,
27 IMapCoversToLocal coverMapper,
28 IUpgradableSpecification upgradableSpecification,
29 ITagService tagService,
30 IBroadcastSignalRMessage signalRBroadcaster)
31 : base(albumService, artistStatisticsService, coverMapper, upgradableSpecification, signalRBroadcaster)
32 {
33 _artistService = artistService;
34 _tagService = tagService;
35 }
36
37 [HttpGet]
38 [Produces("application/json")]
39 public List<AlbumResource> GetCalendar(DateTime? start, DateTime? end, bool unmonitored = false, bool includeArtist = false, string tags = "")
40 {
41 // TODO: Add Album Image support to AlbumControllerWithSignalR
42 var includeAlbumImages = Request.GetBooleanQueryParameter("includeAlbumImages");
43
44 var startUse = start ?? DateTime.Today;
45 var endUse = end ?? DateTime.Today.AddDays(2);
46 var albums = _albumService.AlbumsBetweenDates(startUse, endUse, unmonitored);
47 var allArtists = _artistService.GetAllArtists();
48 var parsedTags = new List<int>();
49 var result = new List<Album>();
50
51 if (tags.IsNotNullOrWhiteSpace())
52 {
53 parsedTags.AddRange(tags.Split(',').Select(_tagService.GetTag).Select(t => t.Id));
54 }
55
56 foreach (var album in albums)
57 {
58 var artist = allArtists.SingleOrDefault(s => s.Id == album.ArtistId);
59
60 if (artist == null)
61 {
62 continue;
63 }
64
65 if (parsedTags.Any() && parsedTags.None(artist.Tags.Contains))
66 {
67 continue;
68 }
69
70 result.Add(album);
71 }
72
73 var resources = MapToResource(result, includeArtist);
74
75 return resources.OrderBy(e => e.ReleaseDate).ToList();
76 }
77 }
78}
79