Radarr/frontend/src/InteractiveImport/Track/SelectTrackModalContentConnector.js
ta264 bb02d73c42 Whole album matching and fingerprinting (#592)
* Cache result of GetAllArtists

* Fixed: Manual import not respecting album import notifications

* Fixed: partial album imports stay in queue, prompting manual import

* Fixed: Allow release if tracks are missing

* Fixed: Be tolerant of missing/extra "The" at start of artist name

* Improve manual import UI

* Omit video tracks from DB entirely

* Revert "faster test packaging in build.sh"

This reverts commit 2723e2a7b8.

-u and -T are not supported on macOS

* Fix tests on linux and macOS

* Actually lint on linux

On linux yarn runs scripts with sh not bash so ** doesn't recursively glob

* Match whole albums

* Option to disable fingerprinting

* Rip out MediaInfo

* Don't split up things that have the same album selected in manual import

* Try to speed up IndentificationService

* More speedups

* Some fixes and increase power of recording id

* Fix NRE when no tags

* Fix NRE when some (but not all) files in a directory have missing tags

* Bump taglib, tidy up tag parsing

* Add a health check

* Remove media info setting

* Tags -> audioTags

* Add some tests where tags are null

* Rename history events

* Add missing method to interface

* Reinstate MediaInfo tags and update info with artist scan

Also adds migration to remove old format media info

* This file no longer exists

* Don't penalise year if missing from tags

* Formatting improvements

* Use correct system newline

* Switch to the netstandard2.0 library to support net 461

* TagLib.File is IDisposable so should be in a using

* Improve filename matching and add tests

* Neater logging of parsed tags

* Fix disk scan tests for new media info update

* Fix quality detection source

* Fix Inexact Artist/Album match

* Add button to clear track mapping

* Fix warning

* Pacify eslint

* Use \ not /

* Fix UI updates

* Fix media covers

Prevent localizing URL propaging back to the metadata object

* Reduce database overhead broadcasting UI updates

* Relax timings a bit to make test pass

* Remove irrelevant tests

* Test framework for identification service

* Fix PreferMissingToBadMatch test case

* Make fingerprinting more robust

* More logging

* Penalize unknown media format and country

* Prefer USA to UK

* Allow Data CD

* Fix exception if fingerprinting fails for all files

* Fix tests

* Fix NRE

* Allow apostrophes and remove accents in filename aggregation

* Address codacy issues

* Cope with old versions of fpcalc and suggest upgrade

* fpcalc health check passes if fingerprinting disabled

* Get the Artist meta with the artist

* Fix the mapper so that lazy loaded lists will be populated on Join

And therefore we can join TrackFiles on Tracks by default and avoid an
extra query

* Rename subtitle -> lyric

* Tidy up MediaInfoFormatter
2019-02-16 09:49:24 -05:00

112 lines
2.9 KiB
JavaScript

import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { fetchTracks, setTracksSort, clearTracks } from 'Store/Actions/trackActions';
import { updateInteractiveImportItem } from 'Store/Actions/interactiveImportActions';
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
import SelectTrackModalContent from './SelectTrackModalContent';
function createMapStateToProps() {
return createSelector(
createClientSideCollectionSelector('tracks'),
createClientSideCollectionSelector('interactiveImport'),
(tracks, interactiveImport) => {
const selectedTracksByItem = _.map(interactiveImport.items, (item) => {
return { id: item.id, tracks: _.map(item.tracks, (track) => {
return track.id;
}) };
});
return {
...tracks,
selectedTracksByItem
};
}
);
}
const mapDispatchToProps = {
fetchTracks,
setTracksSort,
clearTracks,
updateInteractiveImportItem
};
class SelectTrackModalContentConnector extends Component {
//
// Lifecycle
componentDidMount() {
const {
artistId,
albumId,
albumReleaseId
} = this.props;
this.props.fetchTracks({ artistId, albumId, albumReleaseId });
}
componentWillUnmount() {
// This clears the tracks for the queue and hides the queue
// We'll need another place to store tracks for manual import
this.props.clearTracks();
}
//
// Listeners
onSortPress = (sortKey, sortDirection) => {
this.props.setTracksSort({ sortKey, sortDirection });
}
onTracksSelect = (trackIds) => {
const tracks = _.reduce(this.props.items, (acc, item) => {
if (trackIds.indexOf(item.id) > -1) {
acc.push(item);
}
return acc;
}, []);
this.props.updateInteractiveImportItem({
id: this.props.id,
tracks: _.sortBy(tracks, 'trackNumber')
});
this.props.onModalClose(true);
}
//
// Render
render() {
return (
<SelectTrackModalContent
{...this.props}
onSortPress={this.onSortPress}
onTracksSelect={this.onTracksSelect}
/>
);
}
}
SelectTrackModalContentConnector.propTypes = {
id: PropTypes.number.isRequired,
artistId: PropTypes.number.isRequired,
albumId: PropTypes.number.isRequired,
albumReleaseId: PropTypes.number.isRequired,
rejections: PropTypes.arrayOf(PropTypes.object).isRequired,
audioTags: PropTypes.object.isRequired,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
fetchTracks: PropTypes.func.isRequired,
setTracksSort: PropTypes.func.isRequired,
clearTracks: PropTypes.func.isRequired,
updateInteractiveImportItem: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(SelectTrackModalContentConnector);