private MediaMetaData PrepareMediaMetaData(string file, MediaType mediaType,	DateTime dateTimeTaken, 
			string comments, IEnumerable<string> tags, Location location, short rating = 3)
		{
			var mediaMetaData = new MediaMetaData {
				FileName = file,
				DateTaken = dateTimeTaken,
				Comments = comments,
				Tags = tags,
				MediaType = mediaType,
				Location = location,
				Rating = rating,
			};
			_fileSystemHelper.GetFileMediaMetaDataAsync(file).Returns(Task.FromResult(mediaMetaData));
			return mediaMetaData;
		}
		/// <summary>
		/// Determines whether the exif <see cref="MediaMetaData.Comments"/> of 
		/// <paramref name="mediaMetaData"/> contains the specified 
		/// <paramref name="keywords"/>.
		/// </summary>
		/// <returns><c>true</c> if match; otherwise, <c>false</c>.</returns>
		/// <param name="file">File.</param>
		/// <param name="keywords">Keywords.</param>
		private async Task<bool> IsMatchByLocationAsync(MediaMetaData mediaMetaData, string keywords)
		{
			var keywordsList = keywords.Split(new [] {' ', ';', ','}, StringSplitOptions.RemoveEmptyEntries);

			if (mediaMetaData.Location == null)	return false;
			if (IsMatchString(keywordsList, mediaMetaData.Location.AdministrativeArea)) return true;
			if (IsMatchString(keywordsList, mediaMetaData.Location.Country)) return true;
			if (IsMatchString(keywordsList, mediaMetaData.Location.Locality)) return true;
			if (IsMatchString(keywordsList, mediaMetaData.Location.Route)) return true;
			if (IsMatchString(keywordsList, mediaMetaData.Location.State)) return true;

			return false;
		}
		/// <summary>
		/// Determines whether the exif <see cref="MediaMetaData.Tags"/> of 
		/// <paramref name="mediaMetaData"/> contains the specified 
		/// <paramref name="keywords"/>.
		/// </summary>
		/// <returns><c>true</c> if match; otherwise, <c>false</c>.</returns>
		/// <param name="file">File.</param>
		/// <param name="keywords">Keywords.</param>
		private async Task<bool> IsMatchByTagsAsync(MediaMetaData mediaMetaData, string keywords)
		{
			if (Log.IsTraceEnabled)
				Log.T("Search if keywords '{0}' are in tags '{1}'.", keywords, mediaMetaData.Tags);
			var matches = from k in keywords.Split(new [] {' ', ';', ','}, StringSplitOptions.RemoveEmptyEntries)
				          from t in mediaMetaData.Tags
				          where string.Equals(k, t, StringComparison.InvariantCultureIgnoreCase)
			              select t;
			return matches.Any();
		}
		/// <summary>
		/// Determines whether the exif <see cref="MediaMetaData.Comments"/> of 
		/// <paramref name="mediaMetaData"/> contains the specified 
		/// <paramref name="keywords"/>.
		/// </summary>
		/// <returns><c>true</c> if match; otherwise, <c>false</c>.</returns>
		/// <param name="file">File.</param>
		/// <param name="keywords">Keywords.</param>
		private async Task<bool> IsMatchByCommentsAsync(MediaMetaData mediaMetaData, string keywords)
		{
			var keywordsList = keywords.Split(new [] {' ', ';', ','}, StringSplitOptions.RemoveEmptyEntries);
			return IsMatchString(keywordsList, mediaMetaData.Comments);
		}
		/// <summary>
		/// Determines whether <see cref="MediaMetaData.DateTaken"/> of <paramref name="mediaMetaData"/> 
		/// is between <paramref name="dateFrom"/> and <paramref name="dateTo"/>.
		/// </summary>
		/// <returns><c>true</c> if date taken match; otherwise, <c>false</c>.</returns>
		/// <param name="file">File.</param>
		/// <param name="dateFrom">Date from.</param>
		/// <param name="dateTo">Date to.</param>
		private async Task<bool> IsMatchByDateAsync(MediaMetaData mediaMetaData, DateTime? dateFrom, DateTime? dateTo)
		{
			if (dateFrom.HasValue || dateTo.HasValue)
			{
				Log.T("DateFrom ({0}) or DateTo ({1}) has been specified, check if date taken '{2}' is between.", dateFrom, dateTo, mediaMetaData.DateTaken);
				return _utils.IsDateValid(mediaMetaData.DateTaken, dateFrom, dateTo);
			}
			return true;
		}