diff --git a/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContent.js b/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContent.js index 6c42c5ccd..04700237f 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContent.js @@ -11,6 +11,7 @@ import ModalBody from 'Components/Modal/ModalBody'; import ModalFooter from 'Components/Modal/ModalFooter'; import AddImportListItem from './AddImportListItem'; import styles from './AddImportListModalContent.css'; +import titleCase from 'Utilities/String/titleCase'; class AddImportListModalContent extends Component { @@ -22,7 +23,7 @@ class AddImportListModalContent extends Component { isSchemaFetching, isSchemaPopulated, schemaError, - allLists, + listGroups, onImportListSelect, onModalClose } = this.props; @@ -52,23 +53,28 @@ class AddImportListModalContent extends Component {
Lidarr supports multiple lists for importing Albums and Artists into the database.
For more information on the individual lists, click on the info buttons.
- -
-
- { - allLists.map((list) => { - return ( - - ); - }) - } -
-
+ { + Object.keys(listGroups).map((key) => { + return ( +
+
+ { + listGroups[key].map((list) => { + return ( + + ); + }) + } +
+
+ ); + }) + } } @@ -88,7 +94,7 @@ AddImportListModalContent.propTypes = { isSchemaFetching: PropTypes.bool.isRequired, isSchemaPopulated: PropTypes.bool.isRequired, schemaError: PropTypes.object, - allLists: PropTypes.arrayOf(PropTypes.object).isRequired, + listGroups: PropTypes.object.isRequired, onImportListSelect: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired }; diff --git a/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContentConnector.js b/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContentConnector.js index e3b5b1c08..1273035b1 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContentConnector.js +++ b/frontend/src/Settings/ImportLists/ImportLists/AddImportListModalContentConnector.js @@ -1,3 +1,4 @@ +import _ from 'lodash'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; @@ -16,13 +17,13 @@ function createMapStateToProps() { schema } = importLists; - const allLists = schema; + const listGroups = _.groupBy(schema, 'listType'); return { isSchemaFetching, isSchemaPopulated, schemaError, - allLists + listGroups }; } ); diff --git a/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs b/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs index 3c2cc36da..f1a5f4fab 100644 --- a/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs +++ b/src/Lidarr.Api.V1/ImportLists/ImportListResource.cs @@ -10,6 +10,7 @@ namespace Lidarr.Api.V1.ImportLists public int QualityProfileId { get; set; } public int LanguageProfileId { get; set; } public int MetadataProfileId { get; set; } + public ImportListType ListType { get; set; } } public class ImportListResourceMapper : ProviderResourceMapper @@ -29,6 +30,7 @@ namespace Lidarr.Api.V1.ImportLists resource.QualityProfileId = definition.ProfileId; resource.LanguageProfileId = definition.LanguageProfileId; resource.MetadataProfileId = definition.MetadataProfileId; + resource.ListType = definition.ListType; return resource; } @@ -48,6 +50,7 @@ namespace Lidarr.Api.V1.ImportLists definition.ProfileId = resource.QualityProfileId; definition.LanguageProfileId = resource.LanguageProfileId; definition.MetadataProfileId = resource.MetadataProfileId; + definition.ListType = resource.ListType; return definition; } diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs index 2122b8422..470123e30 100644 --- a/src/NzbDrone.Core/Datastore/TableMapping.cs +++ b/src/NzbDrone.Core/Datastore/TableMapping.cs @@ -68,7 +68,8 @@ namespace NzbDrone.Core.Datastore .Ignore(d => d.Tags); Mapper.Entity().RegisterDefinition("ImportLists") - .Ignore(i => i.Enable); + .Ignore(i => i.Enable) + .Ignore(i => i.ListType); Mapper.Entity().RegisterDefinition("Notifications") .Ignore(i => i.SupportsOnGrab) diff --git a/src/NzbDrone.Core/ImportLists/HeadphonesImport/HeadphonesImport.cs b/src/NzbDrone.Core/ImportLists/HeadphonesImport/HeadphonesImport.cs index ec22977f2..6912858af 100644 --- a/src/NzbDrone.Core/ImportLists/HeadphonesImport/HeadphonesImport.cs +++ b/src/NzbDrone.Core/ImportLists/HeadphonesImport/HeadphonesImport.cs @@ -9,6 +9,8 @@ namespace NzbDrone.Core.ImportLists.HeadphonesImport { public override string Name => "Headphones"; + public override ImportListType ListType => ImportListType.Other; + public override int PageSize => 1000; public HeadphonesImport(IHttpClient httpClient, IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, Logger logger) diff --git a/src/NzbDrone.Core/ImportLists/IImportList.cs b/src/NzbDrone.Core/ImportLists/IImportList.cs index 04eb45c07..5aad5bb9d 100644 --- a/src/NzbDrone.Core/ImportLists/IImportList.cs +++ b/src/NzbDrone.Core/ImportLists/IImportList.cs @@ -6,6 +6,7 @@ namespace NzbDrone.Core.ImportLists { public interface IImportList : IProvider { + ImportListType ListType { get; } IList Fetch(); } } diff --git a/src/NzbDrone.Core/ImportLists/ImportListBase.cs b/src/NzbDrone.Core/ImportLists/ImportListBase.cs index 8864830d7..36ae9a184 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListBase.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListBase.cs @@ -21,6 +21,8 @@ namespace NzbDrone.Core.ImportLists public abstract string Name { get; } + public abstract ImportListType ListType {get; } + public ImportListBase(IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, Logger logger) { _importListStatusService = importListStatusService; diff --git a/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs b/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs index 0a31ecdd9..75b9d566f 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs @@ -14,6 +14,7 @@ namespace NzbDrone.Core.ImportLists public override bool Enable => EnableAutomaticAdd; public ImportListStatus Status { get; set; } + public ImportListType ListType { get; set; } } public enum ImportListMonitorType diff --git a/src/NzbDrone.Core/ImportLists/ImportListFactory.cs b/src/NzbDrone.Core/ImportLists/ImportListFactory.cs index a2a793a66..79165d275 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListFactory.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListFactory.cs @@ -35,6 +35,13 @@ namespace NzbDrone.Core.ImportLists return base.Active().Where(c => c.Enable).ToList(); } + public override void SetProviderCharacteristics(IImportList provider, ImportListDefinition definition) + { + base.SetProviderCharacteristics(provider, definition); + + definition.ListType = provider.ListType; + } + public List AutomaticAddEnabled(bool filterBlockedImportLists = true) { var enabledImportLists = GetAvailableProviders().Where(n => ((ImportListDefinition)n.Definition).EnableAutomaticAdd); diff --git a/src/NzbDrone.Core/ImportLists/ImportListType.cs b/src/NzbDrone.Core/ImportLists/ImportListType.cs new file mode 100644 index 000000000..556255095 --- /dev/null +++ b/src/NzbDrone.Core/ImportLists/ImportListType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NzbDrone.Core.ImportLists +{ + public enum ImportListType + { + Spotify, + LastFm, + Other + } +} diff --git a/src/NzbDrone.Core/ImportLists/LastFm/LastFmTag.cs b/src/NzbDrone.Core/ImportLists/LastFm/LastFmTag.cs index 58606beca..0d2da6c61 100644 --- a/src/NzbDrone.Core/ImportLists/LastFm/LastFmTag.cs +++ b/src/NzbDrone.Core/ImportLists/LastFm/LastFmTag.cs @@ -9,6 +9,8 @@ namespace NzbDrone.Core.ImportLists.LastFm { public override string Name => "Last.fm Tag"; + public override ImportListType ListType => ImportListType.LastFm; + public override int PageSize => 1000; public LastFmTag(IHttpClient httpClient, IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, Logger logger) diff --git a/src/NzbDrone.Core/ImportLists/LastFm/LastFmUser.cs b/src/NzbDrone.Core/ImportLists/LastFm/LastFmUser.cs index bb9143a9e..2e944c142 100644 --- a/src/NzbDrone.Core/ImportLists/LastFm/LastFmUser.cs +++ b/src/NzbDrone.Core/ImportLists/LastFm/LastFmUser.cs @@ -9,6 +9,8 @@ namespace NzbDrone.Core.ImportLists.LastFm { public override string Name => "Last.fm User"; + public override ImportListType ListType => ImportListType.LastFm; + public override int PageSize => 1000; public LastFmUser(IHttpClient httpClient, IImportListStatusService importListStatusService, IConfigService configService, IParsingService parsingService, Logger logger) diff --git a/src/NzbDrone.Core/ImportLists/LidarrLists/LidarrLists.cs b/src/NzbDrone.Core/ImportLists/LidarrLists/LidarrLists.cs index 9d8778ec6..fb14fb1a2 100644 --- a/src/NzbDrone.Core/ImportLists/LidarrLists/LidarrLists.cs +++ b/src/NzbDrone.Core/ImportLists/LidarrLists/LidarrLists.cs @@ -12,6 +12,8 @@ namespace NzbDrone.Core.ImportLists.LidarrLists { public override string Name => "Lidarr Lists"; + public override ImportListType ListType => ImportListType.Other; + public override int PageSize => 10; private readonly IMetadataRequestBuilder _requestBuilder; diff --git a/src/NzbDrone.Core/ImportLists/Spotify/SpotifyImportListBase.cs b/src/NzbDrone.Core/ImportLists/Spotify/SpotifyImportListBase.cs index ddc3fec75..d9c8c7564 100644 --- a/src/NzbDrone.Core/ImportLists/Spotify/SpotifyImportListBase.cs +++ b/src/NzbDrone.Core/ImportLists/Spotify/SpotifyImportListBase.cs @@ -32,6 +32,8 @@ namespace NzbDrone.Core.ImportLists.Spotify _importListRepository = importListRepository; } + public override ImportListType ListType => ImportListType.Spotify; + private void RefreshToken() { _logger.Trace("Refreshing Token"); diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 31a628d4c..8722cd90c 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -552,6 +552,7 @@ +