Initial commit — AllMusicGuide scraper and music metadata tagger
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
bin/
|
||||
obj/
|
||||
packages/
|
||||
_ReSharper*/
|
||||
*.suo
|
||||
*.user
|
||||
.vs/
|
||||
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{52212AC5-FABA-4ED5-A6A3-5D221BC59D8B}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>MusicMetaTagger.Client.AllMusicGuide.Tests</RootNamespace>
|
||||
<AssemblyName>MusicMetaTagger.Client.AllMusicGuide.Tests</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="NSubstitute">
|
||||
<HintPath>..\packages\NSubstitute.1.4.3.0\lib\NET40\NSubstitute.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework">
|
||||
<HintPath>..\packages\NUnit.2.6.2\lib\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Services\MusicGuideSearcherTests.cs" />
|
||||
<Compile Include="Services\TrackRaterTests.cs" />
|
||||
<Compile Include="Services\TrackSimilarityTests.cs" />
|
||||
<Compile Include="EqualityTester.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\WebXmlClientTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\XmlClientBaseTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\MusicGuideScraperTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\AlbumParserTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\AlbumResultTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistDiscographyPageParserTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistParserTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistResultTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\SongResultTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\SongTests.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\AlbumScraperTests.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="SerializationTester.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-AbbeyRoad.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-GirlsCanTell.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-KillTheMoonlight.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-MagnoliaScore.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-PulpFiction.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-Reactor.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-Superwolf.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-TrueLoveWaits.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Album-WipersBoxSet.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\AlbumResults-AbbeyRoad.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Artist-Beatles.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Artist-BonniePrinceBilly.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Artist-NeilYoung.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Artist-Spoon.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Artist-Wipers.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\ArtistAlbums-Spoon.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\ArtistCompilations-Beatles.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\ArtistCompilations-Wipers.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\ArtistResults-Spoon.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\ArtistSingles-Beatles.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\Song-HeyJude.xml" />
|
||||
<Content Include="RemoteDataAccess\Parser\Documents\SongResults-HeySnowWhite.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Client.AllMusicGuide\Client.AllMusicGuide.csproj">
|
||||
<Project>{A86C05AB-9720-4D6E-AC5E-9CDE6364945A}</Project>
|
||||
<Name>Client.AllMusicGuide</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Core\Core.csproj">
|
||||
<Project>{EDA98A07-0BF5-4FEE-B341-D8A6A7E581F5}</Project>
|
||||
<Name>Core</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>copy /z "$(ProjectDir)RemoteDataAccess\Parser\Documents\*" "$(TargetDir)"</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,271 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Globalization;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// A static unit testing helper class that can test two objects
|
||||
/// to see if they are equal.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class does not rely on Object.Equals to insure that reference types
|
||||
/// are equal. Instead, it compares all public properties of
|
||||
/// reference types recursively (eventually arriving at value types). If the properties are the same,
|
||||
/// then the objects are assuemd to be equal. This may be changed
|
||||
/// to an optional behavior later on (if anyone has a need for that kind of thing).
|
||||
/// </remarks>
|
||||
/// <author>MBH</author>
|
||||
/// <dateAuthored>11/29/04</dateAuthored>
|
||||
public class EqualityTester
|
||||
{
|
||||
/// <summary>
|
||||
/// When set to true, DateTime objects may differ by < 1 second and still
|
||||
/// be considered equal.
|
||||
/// </summary>
|
||||
private static bool _fuzzyDateMatching;
|
||||
|
||||
/// <summary>
|
||||
/// This is a hack to insure 100% test coverage
|
||||
/// </summary>
|
||||
static EqualityTester()
|
||||
{
|
||||
new EqualityTester();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is a static class, so it cannot be instantiated directly
|
||||
/// </summary>
|
||||
private EqualityTester()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When set to true, DateTime objects may differ by < 1 second and still
|
||||
/// be considered equal.
|
||||
/// </summary>
|
||||
public static bool FuzzyDateMatching
|
||||
{
|
||||
get { return _fuzzyDateMatching; }
|
||||
set { _fuzzyDateMatching = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that the result of enumerating two IEnumerable objects
|
||||
/// are identical.
|
||||
/// </summary>
|
||||
/// <param name = "o1">The first IEnumerable object</param>
|
||||
/// <param name = "o2">The second IEnumerable object</param>
|
||||
private static void AssertIEnumerablesEqual(object o1, object o2)
|
||||
{
|
||||
var enumerator1 = ((IEnumerable) o1).GetEnumerator();
|
||||
var enumerator2 = ((IEnumerable) o2).GetEnumerator();
|
||||
|
||||
var enumerator1Valid = enumerator1.MoveNext();
|
||||
var enumerator2Valid = enumerator2.MoveNext();
|
||||
|
||||
while (enumerator1Valid && enumerator2Valid)
|
||||
{
|
||||
//The two values from the enumerators
|
||||
|
||||
var value1 = enumerator1.Current;
|
||||
|
||||
var value2 = enumerator2.Current;
|
||||
|
||||
AssertEqual(value1, value2);
|
||||
|
||||
enumerator1Valid = enumerator1.MoveNext();
|
||||
enumerator2Valid = enumerator2.MoveNext();
|
||||
}
|
||||
|
||||
//If an enumerator is still valid, that means it had more items in it than the other
|
||||
if (enumerator1Valid)
|
||||
throw (new NotSupportedException("The first IEnumerable object had more items in it than the second."));
|
||||
|
||||
if (enumerator2Valid)
|
||||
throw (new NotSupportedException("The second IEnumerable object had more items in it than the first."));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that two reference-types are equal by comparing their properties.
|
||||
/// </summary>
|
||||
/// <param name = "o1">The first object.</param>
|
||||
/// <param name = "o2">The second object.</param>
|
||||
/// <exception cref = "NotSupportedException"></exception>
|
||||
private static void AssertReferencesEqual(object o1, object o2)
|
||||
{
|
||||
//At this point, it really shouldn't be possible for two things to be of differing types, so no check is performed.
|
||||
|
||||
var t = o1.GetType();
|
||||
|
||||
//Strings are a special case
|
||||
if (t == typeof (string))
|
||||
{
|
||||
//If the strings aren't equal, fail
|
||||
if (!o1.Equals(o2))
|
||||
{
|
||||
throw (new NotSupportedException("Strings are not equal: '" + o1 + "' != '" + o2 + "'"));
|
||||
}
|
||||
}
|
||||
|
||||
if (t.GetInterface("IEnumerable") != null || t.IsArray)
|
||||
AssertIEnumerablesEqual(o1, o2);
|
||||
|
||||
//Assert that all public properties are equal
|
||||
var properties = t.GetProperties();
|
||||
|
||||
var isICollection = t.GetInterface("ICollection") != null;
|
||||
|
||||
foreach (var property in properties)
|
||||
{
|
||||
//If this is a collection, skip the SyncRoot property since
|
||||
//that can vary even if collections have identicial members
|
||||
if (isICollection && property.Name == "SyncRoot")
|
||||
continue;
|
||||
|
||||
//Skip Capacity on ICollections, too, since that can change
|
||||
if (isICollection && property.Name == "Capacity")
|
||||
continue;
|
||||
|
||||
var getMethod = property.GetGetMethod();
|
||||
|
||||
if (getMethod.GetParameters().Length > 0)
|
||||
//this property is an indexer and cannot be checked. If the object implemeneted
|
||||
//IEnumerable, it was probably checked above.
|
||||
continue;
|
||||
|
||||
{
|
||||
var value1 = getMethod.Invoke(o1, new object[] {});
|
||||
|
||||
var value2 = getMethod.Invoke(o2, new object[] {});
|
||||
|
||||
//See if either result is null
|
||||
if (value1 == null || value2 == null)
|
||||
{
|
||||
//If either one is null, they both better be or the test failed.
|
||||
if (value1 != null || value2 != null)
|
||||
throw (new NotSupportedException("Object property accessor returned one null, one not-null for " + getMethod.Name));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (value1.GetType().IsValueType)
|
||||
{
|
||||
try
|
||||
{
|
||||
AssertValuesEqual(value1, value2);
|
||||
}
|
||||
catch (NotSupportedException ex)
|
||||
{
|
||||
var errorMessage = String.Format("Property '{0}' failed equality check. The inner exception is the reason.",
|
||||
property.Name);
|
||||
throw (new NotSupportedException(errorMessage, ex));
|
||||
}
|
||||
}
|
||||
//Don't recurse down the array graph, it's self referencing and will overflow the stack.
|
||||
else if (!(t.IsArray && value1.GetType().IsArray))
|
||||
{
|
||||
try
|
||||
{
|
||||
AssertReferencesEqual(value1, value2);
|
||||
}
|
||||
catch (NotSupportedException ex)
|
||||
{
|
||||
var errorMessage = String.Format("Property '{0}' failed equality check. The inner exception is the reason.",
|
||||
property.Name);
|
||||
throw (new NotSupportedException(errorMessage, ex));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that two value types are equal.
|
||||
/// </summary>
|
||||
/// <param name = "o1">The first value.</param>
|
||||
/// <param name = "o2">The second value</param>
|
||||
/// <exception cref = "NotSupportedException">Thrown if the values aren't equal.</exception>
|
||||
private static void AssertValuesEqual(object o1, object o2)
|
||||
{
|
||||
if (o1 is DateTime)
|
||||
{
|
||||
AssertDateTimesEqual((DateTime) o1, (DateTime) o2);
|
||||
}
|
||||
else if (!o1.Equals(o2))
|
||||
throw (new NotSupportedException(String.Format("Values not equal: '{0}' != '{1}'", o1, o2)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that two DateTime objects are equal.
|
||||
/// </summary>
|
||||
/// <param name = "dateTime1"></param>
|
||||
/// <param name = "dateTime2"></param>
|
||||
private static void AssertDateTimesEqual(DateTime dateTime1, DateTime dateTime2)
|
||||
{
|
||||
if (_fuzzyDateMatching)
|
||||
{
|
||||
if (dateTime1 - dateTime2 > TimeSpan.FromSeconds(1) || dateTime1 - dateTime2 < TimeSpan.FromSeconds(-1))
|
||||
throw (new NotSupportedException(
|
||||
String.Format("DateTime's differ by more than 1 second with fuzzy matching enabled: '{0}' != '{1}'.", dateTime1,
|
||||
dateTime2)));
|
||||
}
|
||||
else if (dateTime1 != dateTime2)
|
||||
throw (new NotSupportedException(String.Format("Values not equal: '{0}' != '{1}'", dateTime1.ToString(CultureInfo.InvariantCulture),
|
||||
dateTime2.ToString(CultureInfo.InvariantCulture))));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that all public properties on the specified objects
|
||||
/// are equal.
|
||||
/// </summary>
|
||||
/// <param name = "o1">The first object</param>
|
||||
/// <param name = "o2">The second object</param>
|
||||
/// <exception cref = "InvalidOperationException">Thrown if the two objects are of different types, indicating an internal error.</exception>
|
||||
/// <exception cref = "NotSupportedException">Thrown if the objects aren't equal.</exception>
|
||||
/// <remarks>
|
||||
/// o1 and o2 must be of the same type.
|
||||
/// </remarks>
|
||||
public static void AssertEqual(object o1, object o2)
|
||||
{
|
||||
if (o1 == null || o2 == null)
|
||||
{
|
||||
//Both values better be null...
|
||||
if (o1 != null || o2 != null)
|
||||
throw (new NotSupportedException("One value type was null while the other was not."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (o1.GetType() != o2.GetType())
|
||||
throw (new InvalidOperationException("AssertEqual called with objects of differing types: " + o1.GetType().Name +
|
||||
", " + o2.GetType().Name));
|
||||
|
||||
var t = o1.GetType();
|
||||
|
||||
if (t.IsValueType)
|
||||
AssertValuesEqual(o1, o2);
|
||||
else
|
||||
AssertReferencesEqual(o1, o2);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recursively tests that all public properties on the specified objects are equal.
|
||||
/// </summary>
|
||||
/// <param name = "o1"></param>
|
||||
/// <param name = "o2"></param>
|
||||
/// <exception cref = "InvalidOperationException">Thrown if the two objects are not of the same type.</exception>
|
||||
/// <returns>true if the objects are equal, false otherwise.</returns>
|
||||
public static bool AreEqual(object o1, object o2)
|
||||
{
|
||||
try
|
||||
{
|
||||
AssertEqual(o1, o2);
|
||||
}
|
||||
catch (NotSupportedException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("MusicMetaTagger.Client.AllMusicGuide.Tests")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("MusicMetaTagger.Client.AllMusicGuide.Tests")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2012")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("fa867999-d234-453f-bbed-d2f85dd65b83")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Client
|
||||
{
|
||||
[TestFixture]
|
||||
public class WebXmlClientTests
|
||||
{
|
||||
[Test, Explicit]
|
||||
public void GetTestHtml()
|
||||
{
|
||||
var songClient = new SongClient();
|
||||
songClient.Read("hey-jude-mt0002046073").Save("Song-HeyJude.xml");
|
||||
|
||||
var albumClient = new AlbumClient();
|
||||
albumClient.Read("abbey-road-mw0000192938").Save("Album-AbbeyRoad.xml");
|
||||
albumClient.Read("girls-can-tell-mw0000624315").Save("Album-GirlsCanTell.xml");
|
||||
albumClient.Read("kill-the-moonlight-mw0000222379").Save("Album-KillTheMoonlight.xml");
|
||||
albumClient.Read("magnolia-original-motion-picture-score-mw0000605476").Save("Album-MagnoliaScore.xml");
|
||||
albumClient.Read("pulp-fiction-mw0000118528").Save("Album-PulpFiction.xml");
|
||||
albumClient.Read("re-ac-tor-mw0000717742").Save("Album-Reactor.xml");
|
||||
albumClient.Read("wipers-box-set-mw0000541566").Save("Album-WipersBoxSet.xml");
|
||||
albumClient.Read("miike-snow-mw0000818771").Save("Album-MiikeSnow.xml");
|
||||
albumClient.Read("superwolf-mw0000363531").Save("Album-Superwolf.xml");
|
||||
albumClient.Read("dark-was-the-night-red-hot-compilation-mw0000807845").Save("Album-DarkWasTheNight.xml");
|
||||
albumClient.Read("true-love-waits-christopher-oriley-plays-radiohead-mw0000631718").Save("Album-TrueLoveWaits.xml");
|
||||
|
||||
var albumResultClient = new AlbumResultPageClient();
|
||||
albumResultClient.Read("abbey road").Save("AlbumResults-AbbeyRoad.xml");
|
||||
|
||||
var artistClient = new ArtistClient();
|
||||
artistClient.Read("the-beatles-mn0000754032").Save("Artist-Beatles.xml");
|
||||
artistClient.Read("spoon-mn0000131038").Save("Artist-Spoon.xml");
|
||||
artistClient.Read("neil-young-mn0000379125").Save("Artist-NeilYoung.xml");
|
||||
artistClient.Read("wipers-mn0000485791").Save("Artist-Wipers.xml");
|
||||
artistClient.Read("bonnie-prince-billy-mn0000094764").Save("Artist-BonniePrinceBilly.xml");
|
||||
|
||||
var artistDiscographyAlbumPageClient = new ArtistDiscographyAlbumPageClient();
|
||||
artistDiscographyAlbumPageClient.Read("spoon-mn0000131038").Save("ArtistAlbums-Spoon.xml");
|
||||
|
||||
var artistDiscographyCompilationPageClient = new ArtistDiscographyCompilationPageClient();
|
||||
artistDiscographyCompilationPageClient.Read("the-beatles-mn0000754032").Save("ArtistCompilations-Beatles.xml");
|
||||
artistDiscographyCompilationPageClient.Read("wipers-mn0000485791").Save("ArtistCompilations-Wipers.xml");
|
||||
|
||||
var artistDiscographyEpSinglesPageClient = new ArtistDiscographyEpSinglesPageClient();
|
||||
artistDiscographyEpSinglesPageClient.Read("the-beatles-mn0000754032").Save("ArtistSingles-Beatles.xml");
|
||||
|
||||
var artistResultPageClient = new ArtistResultPageClient();
|
||||
artistResultPageClient.Read("spoon").Save("ArtistResults-Spoon.xml");
|
||||
|
||||
var songResultsPageClient = new SongResultPageClient();
|
||||
songResultsPageClient.Read("Hey, Snow White").Save("SongResults-HeySnowWhite.xml");
|
||||
}
|
||||
|
||||
[Test, Explicit]
|
||||
public void HtmlScraperTest()
|
||||
{
|
||||
var url = new Uri("http://www.google.com");
|
||||
var xml = WebXmlClient.GetHtmlXml(url);
|
||||
Assert.IsNotNull(xml);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Client
|
||||
{
|
||||
public class GoogleXmlClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string criteria)
|
||||
{
|
||||
return ReadFromCriteria("http://google.com/?q={0}", criteria);
|
||||
}
|
||||
}
|
||||
|
||||
[TestFixture]
|
||||
public class XmlClientBaseTests
|
||||
{
|
||||
[Test, Explicit]
|
||||
public void ReadsDocument()
|
||||
{
|
||||
var client = new GoogleXmlClient();
|
||||
var xmlDocument = client.Read("banana");
|
||||
Assert.That(xmlDocument.InnerText.Contains("banana"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess
|
||||
{
|
||||
[TestFixture]
|
||||
public class MusicGuideScraperTests
|
||||
{
|
||||
private MusicGuideScraper _musicGuideScraper;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_musicGuideScraper = new MusicGuideScraper(
|
||||
new AlbumScraper(), new AlbumResultPageScraper(),
|
||||
new ArtistScraper(), new ArtistResultPageScraper(), new ArtistDiscographyScraper(),
|
||||
new SongResultPageScraper(), new SongScraper());
|
||||
}
|
||||
|
||||
[Test, Explicit]
|
||||
public void SearchArtist_SmokeTest()
|
||||
{
|
||||
var artistResults = _musicGuideScraper.SearchArtist("Beech Boys");
|
||||
foreach (var artistResult in artistResults)
|
||||
{
|
||||
Console.WriteLine("{0}, {1}, {2}", artistResult.ArtistName, artistResult.ResultOrder, artistResult.YearsActive);
|
||||
}
|
||||
}
|
||||
|
||||
[Test, Explicit]
|
||||
public void SearchAlbum_SmokeTest()
|
||||
{
|
||||
var albumResults = _musicGuideScraper.SearchAlbum("smile sessions");
|
||||
foreach (var albumResult in albumResults)
|
||||
{
|
||||
Console.WriteLine("{0}, {1}, {2}", albumResult.ArtistName, albumResult.ResultOrder, albumResult.AlbumTitle);
|
||||
}
|
||||
}
|
||||
|
||||
[Test, Explicit]
|
||||
public void SearchSong_SmokeTest()
|
||||
{
|
||||
var albumResults = _musicGuideScraper.SearchSong("...and the World Laughs With You");
|
||||
foreach (var albumResult in albumResults)
|
||||
{
|
||||
Console.WriteLine("{0}, {1}, {2}", albumResult.ArtistName, albumResult.SongTitle, albumResult.ResultOrder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
using System;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class AlbumParserTests
|
||||
{
|
||||
[Test]
|
||||
public void IsSoundtrack()
|
||||
{
|
||||
var pf = new XmlDocument();
|
||||
pf.Load("Album-PulpFiction.xml");
|
||||
var pulpFiction = new AlbumParser().Parse(pf);
|
||||
|
||||
Assert.IsTrue(pulpFiction.Soundtrack);
|
||||
Assert.That(pulpFiction.ArtistName, Is.EqualTo("Various Artists"));
|
||||
Assert.That(pulpFiction.ArtistId, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParsesScore()
|
||||
{
|
||||
var mag = new XmlDocument();
|
||||
mag.Load("Album-MagnoliaScore.xml");
|
||||
var album = new AlbumParser().Parse(mag);
|
||||
Assert.IsNotNull(album);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParsesMultipleArtists()
|
||||
{
|
||||
var xml = new XmlDocument();
|
||||
xml.Load("Album-Superwolf.xml");
|
||||
var superwolf = new AlbumParser().Parse(xml);
|
||||
|
||||
Assert.That(superwolf.ArtistName, Is.EqualTo("Bonnie \"Prince\" Billy"));
|
||||
Assert.That(superwolf.ArtistId, Is.EqualTo("mn0000094764"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParsesTrueLoveWaits()
|
||||
{
|
||||
var xml = new XmlDocument();
|
||||
xml.Load("Album-TrueLoveWaits.xml");
|
||||
var trueLoveWaits = new AlbumParser().Parse(xml);
|
||||
|
||||
Assert.That(trueLoveWaits.ArtistName, Is.EqualTo("Christopher O'Riley"));
|
||||
Assert.That(trueLoveWaits.ArtistId, Is.EqualTo("mn0000043765"));
|
||||
Assert.That(trueLoveWaits.Tracks.Count, Is.EqualTo(15));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PopulateTest()
|
||||
{
|
||||
var ar = new XmlDocument();
|
||||
ar.Load("Album-AbbeyRoad.xml");
|
||||
var abbeyRoad = new AlbumParser().Parse(ar);
|
||||
|
||||
Assert.AreEqual("Abbey Road", abbeyRoad.Title);
|
||||
Assert.AreEqual("September 26, 1969", abbeyRoad.ReleaseDate);
|
||||
Assert.AreEqual("http://cps-static.rovicorp.com/3/JPG_250/MI0002/910/MI0002910443.jpg", abbeyRoad.CoverUrl);
|
||||
Assert.That(abbeyRoad.Styles.Count, Is.GreaterThan(1));
|
||||
Assert.IsTrue(abbeyRoad.Moods.Count > 0);
|
||||
Assert.IsTrue(abbeyRoad.Review.Length > 0);
|
||||
Assert.IsTrue(abbeyRoad.Themes.Count > 0);
|
||||
Assert.AreEqual("The Beatles", abbeyRoad.ArtistName);
|
||||
Assert.AreEqual("Richie Unterberger", abbeyRoad.Reviewer);
|
||||
Assert.AreEqual("mn0000754032", abbeyRoad.ArtistId);
|
||||
Assert.AreEqual("mw0000192938", abbeyRoad.AlbumId);
|
||||
Assert.AreEqual(10, abbeyRoad.Rating);
|
||||
Assert.Less(1, abbeyRoad.Review.Length);
|
||||
Assert.IsFalse(abbeyRoad.Soundtrack);
|
||||
|
||||
// track check
|
||||
Assert.That(abbeyRoad.Tracks.Count, Is.EqualTo(17));
|
||||
var firstTrack = abbeyRoad.Tracks[0];
|
||||
|
||||
Assert.AreEqual(1, firstTrack.TrackNumber);
|
||||
Assert.AreEqual("mt0010100291", firstTrack.TrackId);
|
||||
Assert.IsTrue(firstTrack.Pick);
|
||||
Assert.AreEqual(firstTrack.TrackLength, new TimeSpan(0, 4, 19));
|
||||
Assert.AreEqual(abbeyRoad.AlbumId, firstTrack.AlbumId);
|
||||
Assert.AreEqual("mn0000754032", firstTrack.PerformerIds[0]);
|
||||
|
||||
|
||||
var gct = new XmlDocument();
|
||||
gct.Load("Album-GirlsCanTell.xml");
|
||||
var girlsCanTell = new AlbumParser().Parse(gct);
|
||||
|
||||
Assert.IsTrue(girlsCanTell.Pick);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializationTest()
|
||||
{
|
||||
var ar = new XmlDocument();
|
||||
ar.Load("Album-AbbeyRoad.xml");
|
||||
var abbeyRoad = new AlbumParser().Parse(ar);
|
||||
|
||||
SerializationTester.AssertBinarySerializable(abbeyRoad);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class AlbumResultTests
|
||||
{
|
||||
private IList<AlbumResult> _albumResults;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var doc = new XmlDocument();
|
||||
doc.Load("AlbumResults-AbbeyRoad.xml");
|
||||
_albumResults = new AlbumResultPageParser().Parse(doc);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AlbumResultsTestSuite()
|
||||
{
|
||||
Assert.IsTrue(_albumResults.Count > 0);
|
||||
var resultInfo = _albumResults[0];
|
||||
Assert.AreEqual("The Beatles", resultInfo.ArtistName);
|
||||
Assert.AreEqual(1, resultInfo.ResultOrder);
|
||||
Assert.AreEqual("mw0000192938", resultInfo.AlbumId);
|
||||
Assert.AreEqual("Pop/Rock", resultInfo.Genre);
|
||||
Assert.AreEqual(1969, resultInfo.Year);
|
||||
Assert.AreEqual("Abbey Road", resultInfo.AlbumTitle);
|
||||
|
||||
Assert.AreNotEqual("The Beatles", _albumResults[1].ArtistName);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AssertSerializableTest()
|
||||
{
|
||||
SerializationTester.AssertBinarySerializable(_albumResults);
|
||||
}
|
||||
}
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class ArtistDiscographyPageParserTests
|
||||
{
|
||||
private XmlDocument _albumsDoc;
|
||||
private XmlDocument _compilationsDoc;
|
||||
private XmlDocument _singlesDoc;
|
||||
private ArtistDiscographyPageParser _parser;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_albumsDoc = new XmlDocument();
|
||||
_albumsDoc.Load("ArtistAlbums-Spoon.xml");
|
||||
_compilationsDoc = new XmlDocument();
|
||||
_compilationsDoc.Load("ArtistCompilations-Beatles.xml");
|
||||
_singlesDoc = new XmlDocument();
|
||||
_singlesDoc.Load("ArtistSingles-Beatles.xml");
|
||||
_parser = new ArtistDiscographyPageParser();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Album_DiscographyTestSuite()
|
||||
{
|
||||
var discography = _parser.Parse(_albumsDoc);
|
||||
Assert.That(discography.Count, Is.EqualTo(8));
|
||||
|
||||
var seriesOfSneaks = discography.Find(a => a.AlbumTitle == "Series of Sneaks");
|
||||
var girlsCanTell = discography.Find(a => a.AlbumTitle == "Girls Can Tell");
|
||||
|
||||
// picks
|
||||
Assert.That(!seriesOfSneaks.Pick);
|
||||
Assert.That(girlsCanTell.Pick);
|
||||
|
||||
// rating
|
||||
Assert.That(seriesOfSneaks.Rating, Is.EqualTo(7));
|
||||
Assert.That(girlsCanTell.Rating, Is.EqualTo(8));
|
||||
|
||||
// id
|
||||
Assert.That(seriesOfSneaks.AlbumId, Is.EqualTo("mw0000226059"));
|
||||
Assert.That(girlsCanTell.AlbumId, Is.EqualTo("mw0000624315"));
|
||||
|
||||
// year
|
||||
Assert.That(seriesOfSneaks.Year, Is.EqualTo(1998));
|
||||
Assert.That(girlsCanTell.Year, Is.EqualTo(2001));
|
||||
|
||||
// type
|
||||
Assert.That(seriesOfSneaks.ReleaseType, Is.EqualTo(ReleaseType.Album));
|
||||
Assert.That(girlsCanTell.ReleaseType, Is.EqualTo(ReleaseType.Album));
|
||||
|
||||
// artist name
|
||||
Assert.That(seriesOfSneaks.ArtistName, Is.EqualTo("Spoon"));
|
||||
Assert.That(seriesOfSneaks.ArtistId, Is.EqualTo("mn0000131038"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Singles_DiscographyTestSuite()
|
||||
{
|
||||
var discography = _parser.Parse(_singlesDoc);
|
||||
Assert.That(discography.Count, Is.EqualTo(52));
|
||||
|
||||
var allMyLoving = discography.Find(a => a.AlbumTitle.StartsWith("All My Loving"));
|
||||
var something = discography.Find(a => a.AlbumTitle == "Something");
|
||||
var yesterday = discography.Find(a => a.AlbumTitle == "Yesterday");
|
||||
|
||||
// Release Type
|
||||
Assert.That(allMyLoving.ReleaseType, Is.EqualTo(ReleaseType.EP));
|
||||
Assert.That(something.ReleaseType, Is.EqualTo(ReleaseType.Single));
|
||||
Assert.That(yesterday.ReleaseType, Is.EqualTo(ReleaseType.Single));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Compilations_DiscographyTestSuite()
|
||||
{
|
||||
var discography = _parser.Parse(_compilationsDoc);
|
||||
Assert.That(discography.Count, Is.EqualTo(197));
|
||||
|
||||
var theEarlyBeatles = discography.Find(a => a.AlbumTitle == "The Early Beatles");
|
||||
var pastMastersVol1 = discography.Find(a => a.AlbumTitle == "Past Masters, Vol. 1");
|
||||
var one = discography.Find(a => a.AlbumTitle == "1");
|
||||
var monoBoxSet = discography.Find(a => a.AlbumTitle == "The Beatles: Mono Box Set");
|
||||
|
||||
// Release Type
|
||||
Assert.That(theEarlyBeatles.ReleaseType, Is.EqualTo(ReleaseType.Compilation));
|
||||
Assert.That(pastMastersVol1.ReleaseType, Is.EqualTo(ReleaseType.Compilation));
|
||||
Assert.That(one.ReleaseType, Is.EqualTo(ReleaseType.Compilation));
|
||||
Assert.That(monoBoxSet.ReleaseType, Is.EqualTo(ReleaseType.BoxSet));
|
||||
|
||||
// Pick
|
||||
Assert.That(pastMastersVol1.Pick, Is.False);
|
||||
Assert.That(one.Pick, Is.True);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class ArtistParserTests
|
||||
{
|
||||
private Artist _artist;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var artistDoc = new XmlDocument();
|
||||
artistDoc.Load("Artist-Spoon.xml");
|
||||
|
||||
_artist = new ArtistParser().Parse(artistDoc);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ArtistInfoTestSuite()
|
||||
{
|
||||
Assert.AreEqual("mn0000131038", _artist.ArtistId);
|
||||
Assert.AreEqual("Pop/Rock", _artist.Genre);
|
||||
Assert.Less(1, _artist.Styles.Count);
|
||||
SerializationTester.AssertBinarySerializable(_artist);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class ArtistResultTests
|
||||
{
|
||||
private List<ArtistResult> _artistResults;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var doc = new XmlDocument();
|
||||
doc.Load("ArtistResults-Spoon.xml");
|
||||
var artistParser = new ArtistResultPageParser();
|
||||
_artistResults = artistParser.Parse(doc);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ArtistResultsTestSuite()
|
||||
{
|
||||
Assert.That(_artistResults.Count, Is.GreaterThan(1));
|
||||
|
||||
var artistResultInfo = _artistResults[0];
|
||||
Assert.AreEqual("Spoon", artistResultInfo.ArtistName);
|
||||
Assert.AreEqual(1, artistResultInfo.ResultOrder);
|
||||
Assert.AreEqual("Pop/Rock", artistResultInfo.Genre);
|
||||
Assert.AreEqual("1990s - 2010s", artistResultInfo.YearsActive);
|
||||
|
||||
Assert.That(_artistResults[2].Genre, Is.Not.StringContaining("Pop/Rock"));
|
||||
|
||||
SerializationTester.AssertBinarySerializable(_artistResults);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
+1275
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+905
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+570
@@ -0,0 +1,570 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<html>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Abbey Road" href="/album/abbey-road-mw0000192938" data-tooltip="{&quot;id&quot;:&quot;MW0000192938&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/910/MI0002910443.jpg?partner=allrovi.com" style="left:-6px" width="114" height="102" alt="Abbey Road" data-debug="170x151 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/abbey-road-mw0000192938" data-tooltip="{&quot;id&quot;:&quot;MW0000192938&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Abbey Road</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-beatles-mn0000754032">The Beatles</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1969 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Other Side of Abbey Road" href="/album/the-other-side-of-abbey-road-mw0000187718" data-tooltip="{&quot;id&quot;:&quot;MW0000187718&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/245/MI0002245051.jpg?partner=allrovi.com" style="left:-0px" width="103" height="102" alt="The Other Side of Abbey Road" data-debug="170x168 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-other-side-of-abbey-road-mw0000187718" data-tooltip="{&quot;id&quot;:&quot;MW0000187718&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Other Side of Abbey Road</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/george-benson-mn0000201760">George Benson</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1970 <br />
|
||||
Jazz </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Abbey Road Sessions" href="/album/the-abbey-road-sessions-mw0002420710" data-tooltip="{&quot;id&quot;:&quot;MW0002420710&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0003/436/MI0003436996.jpg?partner=allrovi.com" style="" width="102" height="102" alt="The Abbey Road Sessions" data-debug="170x170 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-abbey-road-sessions-mw0002420710" data-tooltip="{&quot;id&quot;:&quot;MW0002420710&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Abbey Road Sessions</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/kylie-minogue-mn0000776093">Kylie Minogue</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2012 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Other Way of Crossing (Abbey Road Outtakes)" href="/album/the-other-way-of-crossing-abbey-road-outtakes-mw0001261742" data-tooltip="{&quot;id&quot;:&quot;MW0001261742&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-other-way-of-crossing-abbey-road-outtakes-mw0001261742" data-tooltip="{&quot;id&quot;:&quot;MW0001261742&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Other Way of Crossing (Abbey Road Outtakes)</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-beatles-mn0000754032">The Beatles</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2002 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Abbey Road EP" href="/album/the-abbey-road-ep-mw0000201264" data-tooltip="{&quot;id&quot;:&quot;MW0000201264&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/123/MI0002123554.jpg?partner=allrovi.com" style="left:-1px" width="104" height="102" alt="The Abbey Road EP" data-debug="170x166 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-abbey-road-ep-mw0000201264" data-tooltip="{&quot;id&quot;:&quot;MW0000201264&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Abbey Road EP</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/red-hot-chili-peppers-mn0000883318">Red Hot Chili Peppers</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1988 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Bossa Down Abbey Road" href="/album/bossa-down-abbey-road-mw0001280384" data-tooltip="{&quot;id&quot;:&quot;MW0001280384&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0003/344/MI0003344474.jpg?partner=allrovi.com" style="left:-7px" width="117" height="102" alt="Bossa Down Abbey Road" data-debug="170x148 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/bossa-down-abbey-road-mw0001280384" data-tooltip="{&quot;id&quot;:&quot;MW0001280384&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Bossa Down Abbey Road</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/john-lennon-mn0000232564">John Lennon</a> / <a href="http://www.allmusic.com/artist/the-bnb-mn0002101059">The BNB</a></div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2007 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Late Orchestration: Live at Abbey Road Studios" href="/album/late-orchestration-live-at-abbey-road-studios-mw0000554999" data-tooltip="{&quot;id&quot;:&quot;MW0000554999&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/202/MI0002202512.jpg?partner=allrovi.com" style="left:-0px" width="103" height="102" alt="Late Orchestration: Live at Abbey Road Studios" data-debug="170x167 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/late-orchestration-live-at-abbey-road-studios-mw0000554999" data-tooltip="{&quot;id&quot;:&quot;MW0000554999&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Late Orchestration: Live at Abbey Road Studios</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/kanye-west-mn0000361014">Kanye West</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2006 <br />
|
||||
Rap </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Richard Lush: An Inside Look at Recording at Abbey Road Studios" href="/album/richard-lush-an-inside-look-at-recording-at-abbey-road-studios-mw0001478750" data-tooltip="{&quot;id&quot;:&quot;MW0001478750&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/richard-lush-an-inside-look-at-recording-at-abbey-road-studios-mw0001478750" data-tooltip="{&quot;id&quot;:&quot;MW0001478750&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Richard Lush: An Inside Look at Recording at Abbey Road Studios</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-beatles-mn0000754032">The Beatles</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Missing Chapters, Vol. 5: The Complete Abbey Road Recordings" href="/album/missing-chapters-vol-5-the-complete-abbey-road-recordings-mw0000421992" data-tooltip="{&quot;id&quot;:&quot;MW0000421992&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0001/560/MI0001560747.jpg?partner=allrovi.com" style="left:-0px" width="102" height="102" alt="Missing Chapters, Vol. 5: The Complete Abbey Road Recordings" data-debug="170x169 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/missing-chapters-vol-5-the-complete-abbey-road-recordings-mw0000421992" data-tooltip="{&quot;id&quot;:&quot;MW0000421992&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Missing Chapters, Vol. 5: The Complete Abbey Road Recordings</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/glenn-miller-mn0000661172">Glenn Miller</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1995 <br />
|
||||
Jazz </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Gerry &amp; the Pacemakers at Abbey Road: 1963-1966" href="/album/gerry-the-pacemakers-at-abbey-road-1963-1966-mw0000738762" data-tooltip="{&quot;id&quot;:&quot;MW0000738762&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/803/MI0002803552.jpg?partner=allrovi.com" style="left:-0px" width="103" height="102" alt="Gerry &amp; the Pacemakers at Abbey Road: 1963-1966" data-debug="170x168 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/gerry-the-pacemakers-at-abbey-road-1963-1966-mw0000738762" data-tooltip="{&quot;id&quot;:&quot;MW0000738762&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Gerry &amp; the Pacemakers at Abbey Road: 1963-1966</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/gerry-the-pacemakers-mn0000541125">Gerry & the Pacemakers</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1997 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="At Abbey Road 1966-1970" href="/album/at-abbey-road-1966-1970-mw0000455400" data-tooltip="{&quot;id&quot;:&quot;MW0000455400&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/546/MI0002546919.jpg?partner=allrovi.com" style="left:-0px" width="103" height="102" alt="At Abbey Road 1966-1970" data-debug="170x168 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/at-abbey-road-1966-1970-mw0000455400" data-tooltip="{&quot;id&quot;:&quot;MW0000455400&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">At Abbey Road 1966-1970</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-hollies-mn0000087985">The Hollies</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1997 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Abbey Road Decade 1963-1973" href="/album/the-abbey-road-decade-1963-1973-mw0000340782" data-tooltip="{&quot;id&quot;:&quot;MW0000340782&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0000/740/MI0000740563.jpg?partner=allrovi.com" style="" width="102" height="102" alt="The Abbey Road Decade 1963-1973" data-debug="170x170 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-abbey-road-decade-1963-1973-mw0000340782" data-tooltip="{&quot;id&quot;:&quot;MW0000340782&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Abbey Road Decade 1963-1973</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/cilla-black-mn0000122023">Cilla Black</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1997 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Abbey Road Decade 1973-1989" href="/album/abbey-road-decade-1973-1989-mw0001039445" data-tooltip="{&quot;id&quot;:&quot;MW0001039445&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/062/MI0002062427.jpg?partner=allrovi.com" style="left:-0px" width="102" height="102" alt="Abbey Road Decade 1973-1989" data-debug="170x169 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/abbey-road-decade-1973-1989-mw0001039445" data-tooltip="{&quot;id&quot;:&quot;MW0001039445&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Abbey Road Decade 1973-1989</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-hollies-mn0000087985">The Hollies</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1998 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Shadows at Abbey Road: The Collectors Edition" href="/album/the-shadows-at-abbey-road-the-collectors-edition-mw0000465717" data-tooltip="{&quot;id&quot;:&quot;MW0000465717&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0002/303/MI0002303888.jpg?partner=allrovi.com" style="left:-1px" width="104" height="102" alt="The Shadows at Abbey Road: The Collectors Edition" data-debug="170x166 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-shadows-at-abbey-road-the-collectors-edition-mw0000465717" data-tooltip="{&quot;id&quot;:&quot;MW0000465717&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Shadows at Abbey Road: The Collectors Edition</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-shadows-mn0000496405">The Shadows</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2000 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="At Abbey Road 1963-1966/At Abbey Road 1966-1970/At Abbey Road 1973-1989" href="/album/at-abbey-road-1963-1966-at-abbey-road-1966-1970-at-abbey-road-1973-1989-mw0000461862" data-tooltip="{&quot;id&quot;:&quot;MW0000461862&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0001/980/MI0001980447.jpg?partner=allrovi.com" style="left:-8px" width="118" height="102" alt="At Abbey Road 1963-1966/At Abbey Road 1966-1970/At Abbey Road 1973-1989" data-debug="170x146 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/at-abbey-road-1963-1966-at-abbey-road-1966-1970-at-abbey-road-1973-1989-mw0000461862" data-tooltip="{&quot;id&quot;:&quot;MW0000461862&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">At Abbey Road 1963-1966/At Abbey Road 1966-1970/At Abbey Road 1973-1989</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/the-hollies-mn0000087985">The Hollies</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2000 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Seldom Seen Kid Live at Abbey Road" href="/album/the-seldom-seen-kid-live-at-abbey-road-mw0001345029" data-tooltip="{&quot;id&quot;:&quot;MW0001345029&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0003/286/MI0003286861.jpg?partner=allrovi.com" style="top:-1px;" width="102" height="104" alt="The Seldom Seen Kid Live at Abbey Road" data-debug="166x170 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-seldom-seen-kid-live-at-abbey-road-mw0001345029" data-tooltip="{&quot;id&quot;:&quot;MW0001345029&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Seldom Seen Kid Live at Abbey Road</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/elbow-mn0000134051">Elbow</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2009 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Manfred Mann at Abbey Road, 1963 to 1966" href="/album/manfred-mann-at-abbey-road-1963-to-1966-mw0000981387" data-tooltip="{&quot;id&quot;:&quot;MW0000981387&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/manfred-mann-at-abbey-road-1963-to-1966-mw0000981387" data-tooltip="{&quot;id&quot;:&quot;MW0000981387&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Manfred Mann at Abbey Road, 1963 to 1966</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/manfred-mann-mn0000674662">Manfred Mann</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1997 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Keep Them Freaks a Rollin': Live at Abbey Road" href="/album/keep-them-freaks-a-rollin-live-at-abbey-road-mw0000473211" data-tooltip="{&quot;id&quot;:&quot;MW0000473211&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0001/979/MI0001979245.jpg?partner=allrovi.com" style="left:-0px" width="102" height="102" alt="Keep Them Freaks a Rollin': Live at Abbey Road" data-debug="170x169 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/keep-them-freaks-a-rollin-live-at-abbey-road-mw0000473211" data-tooltip="{&quot;id&quot;:&quot;MW0000473211&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Keep Them Freaks a Rollin': Live at Abbey Road</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/edgar-broughton-band-mn0000797138">Edgar Broughton Band</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2004 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="The Abbey Road Sessions/The Walk" href="/album/the-abbey-road-sessions-the-walk-mw0000250477" data-tooltip="{&quot;id&quot;:&quot;MW0000250477&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0001/554/MI0001554869.jpg?partner=allrovi.com" style="left:-2px" width="106" height="102" alt="The Abbey Road Sessions/The Walk" data-debug="170x163 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/the-abbey-road-sessions-the-walk-mw0000250477" data-tooltip="{&quot;id&quot;:&quot;MW0000250477&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Abbey Road Sessions/The Walk</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/steven-curtis-chapman-mn0000044068">Steven Curtis Chapman</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
2005 <br />
|
||||
Religious, New Age </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result album">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm album">
|
||||
<a title="Abbey Road EP" href="/album/abbey-road-ep-mw0000042327" data-tooltip="{&quot;id&quot;:&quot;MW0000042327&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-album-new" title="album" />
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/album/abbey-road-ep-mw0000042327" data-tooltip="{&quot;id&quot;:&quot;MW0000042327&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Abbey Road EP</a>
|
||||
</div>
|
||||
<div class="artist">
|
||||
<a href="http://www.allmusic.com/artist/spiritualized-mn0000746731">Spiritualized</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
1998 <br />
|
||||
Pop/Rock </div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
+1159
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+6618
File diff suppressed because one or more lines are too long
+619
File diff suppressed because one or more lines are too long
@@ -0,0 +1,441 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<html>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/spoon-mn0000131038" data-tooltip="{&quot;id&quot;:&quot;MN0000131038&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
<div class="cropped-image" style="width:102px;height:102px;">
|
||||
<img src="http://cps-static.rovicorp.com/3/JPG_170/MI0003/184/MI0003184837.jpg?partner=allrovi.com" style="left:-0px" width="102" height="102" alt="Spoon" data-debug="170x169 (63)" />
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-mn0000131038" data-tooltip="{&quot;id&quot;:&quot;MN0000131038&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Pop/Rock
|
||||
<br />
|
||||
|
||||
1990s - 2010s
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/spoon-mn0001366192" data-tooltip="{&quot;id&quot;:&quot;MN0001366192&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-mn0001366192" data-tooltip="{&quot;id&quot;:&quot;MN0001366192&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Pop/Rock
|
||||
<br />
|
||||
|
||||
1990s
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/spoon-mn0001948972" data-tooltip="{&quot;id&quot;:&quot;MN0001948972&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-mn0001948972" data-tooltip="{&quot;id&quot;:&quot;MN0001948972&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Rap
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/spoon-mn0000989000" data-tooltip="{&quot;id&quot;:&quot;MN0000989000&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-mn0000989000" data-tooltip="{&quot;id&quot;:&quot;MN0000989000&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Rap
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/spoon-mn0002487567" data-tooltip="{&quot;id&quot;:&quot;MN0002487567&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-mn0002487567" data-tooltip="{&quot;id&quot;:&quot;MN0002487567&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Blues
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/spoon-mn0001899918" data-tooltip="{&quot;id&quot;:&quot;MN0001899918&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-mn0001899918" data-tooltip="{&quot;id&quot;:&quot;MN0001899918&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Electronic
|
||||
<br />
|
||||
|
||||
1990s
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/dj-spoon-mn0000518889" data-tooltip="{&quot;id&quot;:&quot;MN0000518889&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/dj-spoon-mn0000518889" data-tooltip="{&quot;id&quot;:&quot;MN0000518889&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">DJ Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/plate-fork-knife-spoon-mn0000247017" data-tooltip="{&quot;id&quot;:&quot;MN0000247017&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/plate-fork-knife-spoon-mn0000247017" data-tooltip="{&quot;id&quot;:&quot;MN0000247017&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Plate Fork Knife Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Rap
|
||||
<br />
|
||||
|
||||
2000s
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/the-bent-spoon-trio-mn0002068970" data-tooltip="{&quot;id&quot;:&quot;MN0002068970&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/the-bent-spoon-trio-mn0002068970" data-tooltip="{&quot;id&quot;:&quot;MN0002068970&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Bent Spoon Trio</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Pop/Rock
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/tong-amp-spoon-mn0001002429" data-tooltip="{&quot;id&quot;:&quot;MN0001002429&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/tong-amp-spoon-mn0001002429" data-tooltip="{&quot;id&quot;:&quot;MN0001002429&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Tong &amp; Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Electronic
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/ken-little-amp-the-spoon-river-band-mn0001335061" data-tooltip="{&quot;id&quot;:&quot;MN0001335061&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/ken-little-amp-the-spoon-river-band-mn0001335061" data-tooltip="{&quot;id&quot;:&quot;MN0001335061&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Ken Little &amp; The Spoon River Band</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Pop/Rock
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/wooden-spoon-mn0001180770" data-tooltip="{&quot;id&quot;:&quot;MN0001180770&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/wooden-spoon-mn0001180770" data-tooltip="{&quot;id&quot;:&quot;MN0001180770&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Wooden Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
International
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/spoon-harris-amp-obernik-mn0001032971" data-tooltip="{&quot;id&quot;:&quot;MN0001032971&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-harris-amp-obernik-mn0001032971" data-tooltip="{&quot;id&quot;:&quot;MN0001032971&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon, Harris &amp; Obernik</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Electronic
|
||||
<br />
|
||||
|
||||
2000s
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/billy-spoon-mn0001833920" data-tooltip="{&quot;id&quot;:&quot;MN0001833920&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/billy-spoon-mn0001833920" data-tooltip="{&quot;id&quot;:&quot;MN0001833920&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Billy Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Religious
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/spoon-jackson-mn0001713736" data-tooltip="{&quot;id&quot;:&quot;MN0001713736&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-jackson-mn0001713736" data-tooltip="{&quot;id&quot;:&quot;MN0001713736&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon Jackson</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm artist">
|
||||
<a href="/artist/sam-spoon-mn0000241584" data-tooltip="{&quot;id&quot;:&quot;MN0000241584&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/sam-spoon-mn0000241584" data-tooltip="{&quot;id&quot;:&quot;MN0000241584&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Sam Spoon</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/the-spoon-wizard-mn0000484283" data-tooltip="{&quot;id&quot;:&quot;MN0000484283&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/the-spoon-wizard-mn0000484283" data-tooltip="{&quot;id&quot;:&quot;MN0000484283&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Spoon Wizard</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/the-spoon-benders-mn0001456514" data-tooltip="{&quot;id&quot;:&quot;MN0001456514&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/the-spoon-benders-mn0001456514" data-tooltip="{&quot;id&quot;:&quot;MN0001456514&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">The Spoon Benders</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
Pop/Rock
|
||||
<br /></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/lord-spoon-amp-david-mn0000232230" data-tooltip="{&quot;id&quot;:&quot;MN0000232230&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/lord-spoon-amp-david-mn0000232230" data-tooltip="{&quot;id&quot;:&quot;MN0000232230&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Lord Spoon &amp; David</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result artist">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm group">
|
||||
<a href="/artist/spoon-bread-mn0000790575" data-tooltip="{&quot;id&quot;:&quot;MN0000790575&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-artist-new" title="artist" />
|
||||
</div>
|
||||
<div class="name">
|
||||
<a href="http://www.allmusic.com/artist/spoon-bread-mn0000790575" data-tooltip="{&quot;id&quot;:&quot;MN0000790575&quot;,&quot;thumbnail&quot;:true,&quot;position&quot;:{&quot;my&quot;:&quot;left center&quot;,&quot;at&quot;:&quot;middle right&quot;}}">Spoon Bread</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</html>
|
||||
+2517
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+453
@@ -0,0 +1,453 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<html>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Hey, Snow White by The New Pornographers" href="/song/hey-snow-white-mt0031275831">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=RfSe5itQayF7azF__JToGvh0BJxFGWncDvRkmPV4knk=&f=J" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/hey-snow-white-mt0031275831">&quot;Hey, Snow White&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/the-new-pornographers-mn0000477787">The New Pornographers</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/daniel-bejar-mn0000786070">Daniel Bejar</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Hey, Snow White " href="/song/hey-snow-white-mt0009946885">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/hey-snow-white-mt0009946885">&quot;Hey, Snow White&quot;</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Hey, Snow White by Destroyer" href="/song/hey-snow-white-mt0006219769">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=3BuZS-D2JPy8YF2iYUS_GTqpU4hxl5saPDaNIVORh-E=&f=J" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/hey-snow-white-mt0006219769">&quot;Hey, Snow White&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/destroyer-mn0000247065">Destroyer</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/destroyer-mn0000247065">Destroyer</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Hey Dante by Linda Draper" href="/song/hey-dante-mt0016101059">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/hey-dante-mt0016101059">&quot;Hey Dante&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/linda-draper-mn0000374418">Linda Draper</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Whistle While You Work (Snow White and the Seven Dwarfs) by Louis Armstrong" href="/song/whistle-while-you-work-snow-white-and-the-seven-dwarfs-mt0004060986">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/whistle-while-you-work-snow-white-and-the-seven-dwarfs-mt0004060986">&quot;Whistle While You Work (Snow White and the Seven Dwarfs)&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/louis-armstrong-mn0000234518">Louis Armstrong</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/frank-churchill-mn0000157215">Frank Churchill</a> / <a href="http://www.allmusic.com/artist/larry-morey-mn0000110108">Larry Morey</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="White Christmas/Whiter Than Snow by Twila Paris" href="/song/white-christmas-whiter-than-snow-mt0011666845">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=Nfg1aTYVvTfwLisQvx56wvh0BJxFGWncDvRkmPV4knk=&f=I" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/white-christmas-whiter-than-snow-mt0011666845">&quot;White Christmas/Whiter Than Snow&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/twila-paris-mn0000803533">Twila Paris</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/irving-berlin-mn0000103748">Irving Berlin</a> / <a href="http://www.allmusic.com/artist/james-david-nicholson-mn0001213557">James David Nicholson</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White Medley: Someday My Prince Will Come/Whistle While You Work by Chris Calabrese" href="/song/snow-white-medley-someday-my-prince-will-come-whistle-while-you-work-mt0007930083">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=IU40DuYY71JYYAfMpTEAzs2KXJKuJLE7UG4BJXcyKZ4=&f=J" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-medley-someday-my-prince-will-come-whistle-while-you-work-mt0007930083">&quot;Snow White Medley: Someday My Prince Will Come/Whistle While You Work&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/chris-calabrese-mn0000108062">Chris Calabrese</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/larry-morey-mn0000110108">Larry Morey</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White Medley: Whistle While You Work/I'm ... by Mike Curb CongregationMike Curb" href="/song/snow-white-medley-whistle-while-you-work-im--mt0006190157">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=aqewkLT-agNyWzIse7yGXKwfpsQHuOlGC4-o-yXc8Os=&f=J" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-medley-whistle-while-you-work-im--mt0006190157">&quot;Snow White Medley: Whistle While You Work/I'm ...&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/mike-curb-congregation-mn0000477163">Mike Curb Congregation</a> / <a href="http://www.allmusic.com/artist/mike-curb-mn0000893135">Mike Curb</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/larry-morey-mn0000110108">Larry Morey</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Whistle While You Work (From Snow White and the by Adriana Caselotti" href="/song/whistle-while-you-work-from-snow-white-and-the-mt0041924984">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/whistle-while-you-work-from-snow-white-and-the-mt0041924984">&quot;Whistle While You Work (From Snow White and the&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/adriana-caselotti-mn0000499710">Adriana Caselotti</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Whistle While You Work- Snow White " href="/song/whistle-while-you-work-snow-white-mt0004567056">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=a7XEW8Ero9YYyqH-746LvJjWf7KriH64XH0cLbjLrOY=&f=J" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/whistle-while-you-work-snow-white-mt0004567056">&quot;Whistle While You Work- Snow White&quot;</a>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White and the Seven Dwarfs Film Medley: Whistle While You Work/Someday My Prince Will Come/I'm Wishing by Reginald Foort" href="/song/snow-white-and-the-seven-dwarfs-film-medley-whistle-while-you-work-someday-my-prince-will-come-im-wishing-mt0009725790">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-and-the-seven-dwarfs-film-medley-whistle-while-you-work-someday-my-prince-will-come-im-wishing-mt0009725790">&quot;Snow White and the Seven Dwarfs Film Medley: Whistle While You Work/Someday My Prince Will Come/I'm Wishing&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/reginald-foort-mn0002172965">Reginald Foort</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White Selection: Some Day My Prince Will Come/Whistle While ... by Paul Roberts" href="/song/snow-white-selection-some-day-my-prince-will-come-whistle-while--mt0015118935">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-selection-some-day-my-prince-will-come-whistle-while--mt0015118935">&quot;Snow White Selection: Some Day My Prince Will Come/Whistle While ...&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/paul-roberts-mn0001528672">Paul Roberts</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White & The Seven Dwarfs: Whistle While You by Animation Soundtrack Ensemble" href="/song/snow-white-the-seven-dwarfs-whistle-while-you-mt0020382831">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-the-seven-dwarfs-whistle-while-you-mt0020382831">&quot;Snow White & The Seven Dwarfs: Whistle While You&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/animation-soundtrack-ensemble-mn0002127716">Animation Soundtrack Ensemble</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Whistle While You Work - Snow White by Matinee Sounds Unlimited" href="/song/whistle-while-you-work-snow-white-mt0046362862">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/whistle-while-you-work-snow-white-mt0046362862">&quot;Whistle While You Work - Snow White&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/matinee-sounds-unlimited-mn0003054056">Matinee Sounds Unlimited</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White & The Seven Dwarfs: Whistle While You Work by Animation Soundtrack Ensemble" href="/song/snow-white-the-seven-dwarfs-whistle-while-you-work-mt0020062343">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-the-seven-dwarfs-whistle-while-you-work-mt0020062343">&quot;Snow White & The Seven Dwarfs: Whistle While You Work&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/animation-soundtrack-ensemble-mn0002127716">Animation Soundtrack Ensemble</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White and the Seven Dwarfs: Whistle while you work by Arthur Fiedler" href="/song/snow-white-and-the-seven-dwarfs-whistle-while-you-work-mt0004900160">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-and-the-seven-dwarfs-whistle-while-you-work-mt0004900160">&quot;Snow White and the Seven Dwarfs: Whistle while you work&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/arthur-fiedler-mn0000932323">Arthur Fiedler</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White and the Seven Dwarfs: Whistle while you work by Boston Pops OrchestraArthur FiedlerJohn Williams" href="/song/snow-white-and-the-seven-dwarfs-whistle-while-you-work-mt0000078569">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-and-the-seven-dwarfs-whistle-while-you-work-mt0000078569">&quot;Snow White and the Seven Dwarfs: Whistle while you work&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/boston-pops-orchestra-mn0000813561">Boston Pops Orchestra</a> / <a href="http://www.allmusic.com/artist/arthur-fiedler-mn0000932323">Arthur Fiedler</a> / <a href="http://www.allmusic.com/artist/john-williams-mn0000232480">John Williams</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snowy White Snow and Jingle Bells [Remastered] by Vaughn Monroe & His Orchestra" href="/song/snowy-white-snow-and-jingle-bells-remastered-mt0046103875">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snowy-white-snow-and-jingle-bells-remastered-mt0046103875">&quot;Snowy White Snow and Jingle Bells [Remastered]&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/vaughn-monroe-his-orchestra-mn0000839634">Vaughn Monroe & His Orchestra</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
<br />Composed by <a href="http://www.allmusic.com/artist/billy-reid-mn0000076652">Billy Reid</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snow White Medley: Some Day My Prince Will Come/Whistle While You Wor by Sidney Torch" href="/song/snow-white-medley-some-day-my-prince-will-come-whistle-while-you-wor-mt0012079409">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<span class="sprite2 icon-search-song-new-none" title="no audio sample available" />
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snow-white-medley-some-day-my-prince-will-come-whistle-while-you-wor-mt0012079409">&quot;Snow White Medley: Some Day My Prince Will Come/Whistle While You Wor&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/sidney-torch-mn0000382463">Sidney Torch</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="search-result song">
|
||||
<td>
|
||||
<div class="image">
|
||||
<div class="thumbnail sm song">
|
||||
<a title="Snowy White Snow and Jingle Bells by Vaughn Monroe" href="/song/snowy-white-snow-and-jingle-bells-mt0027919514">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right-of-image">
|
||||
<div class="type">
|
||||
<div class="ui360 icon-search-song-new">
|
||||
<a href="http://rovimusic.rovicorp.com/playback.mp3?c=bPpgbv6Yx1k794MNedtFXoapJnH0KBK7tayJ1L1z1aM=&f=J" title="play sample" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">
|
||||
<a href="http://www.allmusic.com/song/snowy-white-snow-and-jingle-bells-mt0027919514">&quot;Snowy White Snow and Jingle Bells&quot;</a>
|
||||
<br />
|
||||
<span class="performer">by <a href="http://www.allmusic.com/artist/vaughn-monroe-mn0000839335">Vaughn Monroe</a></span>
|
||||
</div>
|
||||
<div class="info">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</html>
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class SongResultTests
|
||||
{
|
||||
private IList<SongResult> _songResults;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var doc = new XmlDocument();
|
||||
doc.Load("SongResults-HeySnowWhite.xml");
|
||||
_songResults = new SongResultPageParser().Parse(doc);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SongResultsTestSuite()
|
||||
{
|
||||
Assert.IsTrue(_songResults.Count > 0);
|
||||
var resultInfo = _songResults[0];
|
||||
Assert.AreEqual("The New Pornographers", resultInfo.ArtistName);
|
||||
Assert.AreEqual(1, resultInfo.ResultOrder);
|
||||
Assert.AreEqual("mt0031275831", resultInfo.SongId);
|
||||
Assert.AreEqual("Hey, Snow White", resultInfo.SongTitle);
|
||||
|
||||
Assert.AreNotEqual("The New Pornographers", _songResults[1].ArtistName);
|
||||
Assert.AreEqual(2, _songResults[1].ResultOrder);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Parser
|
||||
{
|
||||
[TestFixture]
|
||||
public class SongTests
|
||||
{
|
||||
private Song _heyJude;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var doc = new XmlDocument();
|
||||
doc.Load("Song-HeyJude.xml");
|
||||
_heyJude = new SongParser().Parse(doc);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SongTestSuite()
|
||||
{
|
||||
Assert.AreEqual("Hey Jude", _heyJude.SongTitle);
|
||||
Assert.AreEqual("mt0002046073", _heyJude.SongId);
|
||||
Assert.That(_heyJude.AppearsOnAlbum.Count, Is.GreaterThan(1));
|
||||
|
||||
var firstAlbum = _heyJude.AppearsOnAlbum[0];
|
||||
Assert.That(firstAlbum.AlbumTitle, Is.EqualTo("Hey Jude"));
|
||||
Assert.That(firstAlbum.ArtistName, Is.EqualTo("The Beatles"));
|
||||
Assert.That(firstAlbum.Year, Is.EqualTo(1970));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.RemoteDataAccess.Scraper
|
||||
{
|
||||
[TestFixture]
|
||||
class AlbumScraperTests
|
||||
{
|
||||
[Test, Explicit]
|
||||
public void ScrapeTest()
|
||||
{
|
||||
var loadedAlbumInfo = new AlbumScraper().Scrape("r1525");
|
||||
|
||||
Assert.AreEqual("Abbey Road", loadedAlbumInfo.Title);
|
||||
Assert.AreEqual("September 26, 1969", loadedAlbumInfo.ReleaseDate);
|
||||
Assert.AreEqual("The Beatles", loadedAlbumInfo.ArtistName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests
|
||||
{
|
||||
public static class SerializationTester
|
||||
{
|
||||
private static void AssertFormatterSerializable(IFormatter formatter, object o)
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
|
||||
try
|
||||
{
|
||||
formatter.Serialize(stream, o);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw (new NotSupportedException("The object failed serialization.", ex));
|
||||
}
|
||||
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
object temp;
|
||||
|
||||
try
|
||||
{
|
||||
temp = formatter.Deserialize(stream);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw (new NotSupportedException("The object failed deserialization.", ex));
|
||||
}
|
||||
|
||||
EqualityTester.AssertEqual(o, temp);
|
||||
}
|
||||
|
||||
public static void AssertBinarySerializable(object o)
|
||||
{
|
||||
var formatter = new BinaryFormatter();
|
||||
|
||||
try
|
||||
{
|
||||
AssertFormatterSerializable(formatter, o);
|
||||
}
|
||||
catch (NotSupportedException ex)
|
||||
{
|
||||
throw (new NotSupportedException("The object failed binary serialization or deserialization.", ex));
|
||||
}
|
||||
}
|
||||
|
||||
public static void AssertXmlSerializable(object o)
|
||||
{
|
||||
var t = o.GetType();
|
||||
|
||||
var serializer = new XmlSerializer(t);
|
||||
|
||||
var stream = new MemoryStream();
|
||||
|
||||
try
|
||||
{
|
||||
serializer.Serialize(stream, o);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw (new NotSupportedException("The object failed XML serialization.", ex));
|
||||
}
|
||||
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
object temp;
|
||||
|
||||
try
|
||||
{
|
||||
temp = serializer.Deserialize(stream);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw (new NotSupportedException("The object failed XML deserialization.", ex));
|
||||
}
|
||||
|
||||
EqualityTester.AssertEqual(o, temp);
|
||||
}
|
||||
|
||||
public static void AssertSerializable(object o)
|
||||
{
|
||||
AssertBinarySerializable(o);
|
||||
AssertXmlSerializable(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Services;
|
||||
using MusicMetaTagger.Core.Queries;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.Services
|
||||
{
|
||||
[TestFixture]
|
||||
public class MusicGuideSearcherTests
|
||||
{
|
||||
[Test, Explicit]
|
||||
public void SearchTrackTests()
|
||||
{
|
||||
var trackSearcher = new TrackSearcher(
|
||||
new MusicGuideScraper(
|
||||
new AlbumScraper(), new AlbumResultPageScraper(),
|
||||
new ArtistScraper(), new ArtistResultPageScraper(), new ArtistDiscographyScraper(),
|
||||
new SongResultPageScraper(), new SongScraper()));
|
||||
|
||||
trackSearcher.SearchStatusUpdate += status => Debug.WriteLine(status.Status);
|
||||
|
||||
var trackQueries =
|
||||
new List<TrackQuery>
|
||||
{
|
||||
//new TrackQuery { ArtistName = "The Beach Boys", AlbumTitle = "The Smile Sessions", TrackTitle = "Gee", TrackLength = new TimeSpan(0,0,0,52), TrackNumber = 2},
|
||||
//new TrackQuery { ArtistName = "Wipers", AlbumTitle = "Wipers Box Set (disc 2: Youth of America)", TrackTitle = "When It's Over", TrackLength = new TimeSpan(0,0,6,36), TrackNumber = 6},
|
||||
//new TrackQuery { ArtistName = "Bonnie 'Prince' Billy & Matt Sweeney", AlbumTitle = "Superwolf", TrackTitle = "My Home Is the Sea", TrackLength = new TimeSpan(0,0,5,49), TrackNumber = 1},
|
||||
//new TrackQuery { ArtistName = "Aimee Mann & Michael Penn", AlbumTitle = "I Am Sam", TrackTitle = "Two of Us", TrackLength = new TimeSpan(0,0,3,31), TrackNumber = 1},
|
||||
//new TrackQuery { ArtistName = "rufus wainwright", AlbumTitle = "I Am Sam", TrackTitle = "Across the Universe", TrackLength = new TimeSpan(0,0,4,08), TrackNumber = 3},
|
||||
//new TrackQuery { ArtistName = "T.I.", AlbumTitle = "Pitchfork - Best of 2006", TrackTitle = "What You Know", TrackLength = new TimeSpan(0,0,4,34), AlbumPartOfCompilation = true},
|
||||
//new TrackQuery { ArtistName = "Dios", AlbumTitle = "Dios", TrackTitle = "Nobody's Perfect", TrackLength = new TimeSpan(0,0,5,27), TrackNumber = 1},
|
||||
//new TrackQuery {ArtistName = "Jan Hammer", TrackTitle = "Crockett's Theme"}
|
||||
//new TrackQuery { AlbumTitle = "Magnolia", TrackTitle = "One"},
|
||||
//new TrackQuery {ArtistName = "!!!", TrackTitle = "Myth Takes"},
|
||||
//new TrackQuery {ArtistName = "!!!", AlbumTitle = "Myth Takes", TrackTitle = "Myth Takes", TrackNumber = 1},
|
||||
//new TrackQuery {ArtistName = "Queen", TrackTitle = "Another One Bites the Dust"},
|
||||
//new TrackQuery {ArtistName = "Radiohad", TrackTitle = "Paranod Androd"},
|
||||
//new TrackQuery{ArtistName = "Modest Mouse", AlbumTitle = "The Lonely Crowded West", TrackTitle = "Cowboy Dan"},
|
||||
//new TrackQuery("Ruling the World") {ArtistName = "Jarvis Cocker"},
|
||||
//new TrackQuery {ArtistName = "Radiohead", TrackTitle = "Melatonin"}
|
||||
//new TrackQuery {ArtistName = "Flying Lotus feat. Thom Yorke", TrackTitle = "...and the World Laughs With You", AlbumArtistName = "Flying Lotus"},
|
||||
//new TrackQuery {ArtistName = "Flying Lotus", TrackTitle = "...and the World Laughs With You", AlbumArtistName = "Flying Lotus"}
|
||||
//new TrackQuery {ArtistName = "Bill Frisell", TrackTitle = "I Heard It Through the Grapevine", AlbumTitle = "East/West"}
|
||||
//new TrackQuery {ArtistName = "Christopher O'Riley", TrackTitle = "Everything In It's Right Place", AlbumTitle = "True Love Waits: Christopher O'Riley Plays Radiohead"}
|
||||
//new TrackQuery {ArtistName = "Roger Waters", TrackTitle = "Comfortably Numb (live) (feat. Van Morrison & The Band)", AlbumTitle = "The Departed", AlbumPartOfCompilation = true, TrackLength = new TimeSpan(0,0,8,0), TrackNumber = 1}
|
||||
//new TrackQuery {ArtistName = "Sharon Phillips", TrackTitle = "Want 2 / Need 2 (Trentemøller remix)", AlbumTitle = "The Trentemøller Chronicles (disc 2)", AlbumPartOfCompilation = false, TrackLength = new TimeSpan(0,0,6,03), TrackNumber = 8},
|
||||
//new TrackQuery {ArtistName = "Cozy Powell", TrackTitle = "Dance with the Devil", AlbumTitle = "Hot Fuzz", AlbumPartOfCompilation = false, TrackLength = new TimeSpan(0,0,3,17), TrackNumber = 5}
|
||||
new TrackQuery {ArtistName = "Alice in Chains", TrackTitle = "Rooster", AlbumTitle = "Dirt", AlbumPartOfCompilation = false, TrackLength = new TimeSpan(0,0,6,15), TrackNumber = 5}
|
||||
};
|
||||
|
||||
|
||||
foreach (var track in trackQueries.Select(trackQuery => trackSearcher.SearchTrack(trackQuery, new CancellationToken())))
|
||||
{
|
||||
Assert.IsNotNull(track);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Services;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Services;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.Services
|
||||
{
|
||||
[TestFixture]
|
||||
public class TrackRaterTests
|
||||
{
|
||||
private IMusicGuide _musicGuide;
|
||||
private Album _abbeyRoad;
|
||||
private Artist _beatles;
|
||||
private Album _killTheMoonLight;
|
||||
private Album _girlsCanTell;
|
||||
private Artist _spoon;
|
||||
private Album _reactor;
|
||||
private Artist _neilYoung;
|
||||
private Album _pulpFiction;
|
||||
private Album _wipersBoxSet;
|
||||
private Artist _wipers;
|
||||
|
||||
private static TEntity LoadObj<TEntity, TParser>(string filename) where TParser : IParser<TEntity>, new()
|
||||
{
|
||||
var xml = new XmlDocument();
|
||||
xml.Load(filename);
|
||||
return new TParser().Parse(xml);
|
||||
}
|
||||
|
||||
private static Artist LoadArtist(string filename)
|
||||
{
|
||||
var xml = new XmlDocument();
|
||||
xml.Load(filename);
|
||||
var artist = new ArtistParser().Parse(xml);
|
||||
artist.Discography = new ArtistDiscographyPageParser().Parse(xml);
|
||||
return artist;
|
||||
}
|
||||
|
||||
[TestFixtureSetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
_abbeyRoad = LoadObj<Album, AlbumParser>("Album-AbbeyRoad.xml");
|
||||
_killTheMoonLight = LoadObj<Album, AlbumParser>("Album-KillTheMoonLight.xml");
|
||||
_girlsCanTell = LoadObj<Album, AlbumParser>("Album-GirlsCanTell.xml");
|
||||
_reactor = LoadObj<Album, AlbumParser>("Album-Reactor.xml");
|
||||
_pulpFiction = LoadObj<Album, AlbumParser>("Album-PulpFiction.xml");
|
||||
_wipersBoxSet = LoadObj<Album, AlbumParser>("Album-WipersBoxSet.xml");
|
||||
|
||||
_beatles = LoadArtist("Artist-Beatles.xml");
|
||||
_spoon = LoadArtist("Artist-Spoon.xml");
|
||||
_neilYoung = LoadArtist("Artist-NeilYoung.xml");
|
||||
|
||||
var wipers = new XmlDocument();
|
||||
wipers.Load("Artist-Wipers.xml");
|
||||
_wipers = new ArtistParser().Parse(wipers);
|
||||
_wipers.Discography = new ArtistDiscographyPageParser().Parse(wipers);
|
||||
var wipersCompilations = new XmlDocument();
|
||||
wipersCompilations.Load("ArtistCompilations-Wipers.xml");
|
||||
_wipers.Discography.AddRange(new ArtistDiscographyPageParser().Parse(wipersCompilations));
|
||||
|
||||
_musicGuide = Substitute.For<IMusicGuide>();
|
||||
_musicGuide.GetAlbum(_abbeyRoad.AlbumId).Returns(_abbeyRoad);
|
||||
_musicGuide.GetArtist(_beatles.ArtistId).Returns(_beatles);
|
||||
_musicGuide.GetAlbum(_girlsCanTell.AlbumId).Returns(_girlsCanTell);
|
||||
_musicGuide.GetAlbum(_killTheMoonLight.AlbumId).Returns(_killTheMoonLight);
|
||||
_musicGuide.GetArtist(_spoon.ArtistId).Returns(_spoon);
|
||||
_musicGuide.GetAlbum(_reactor.AlbumId).Returns(_reactor);
|
||||
_musicGuide.GetArtist(_neilYoung.ArtistId).Returns(_neilYoung);
|
||||
_musicGuide.GetAlbum(_pulpFiction.AlbumId).Returns(_pulpFiction);
|
||||
_musicGuide.GetAlbum(_wipersBoxSet.AlbumId).Returns(_wipersBoxSet);
|
||||
_musicGuide.GetArtist(_wipers.ArtistId).Returns(_wipers);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RateTrackTest()
|
||||
{
|
||||
var trackRater = new TrackRater(_musicGuide);
|
||||
|
||||
Assert.That(trackRater.RateTrack(_abbeyRoad.Tracks[0]), Is.EqualTo(10));
|
||||
Assert.That(trackRater.RateTrack(_abbeyRoad.Tracks[1]), Is.EqualTo(10));
|
||||
Assert.That(trackRater.RateTrack(_abbeyRoad.Tracks[2]), Is.EqualTo(9));
|
||||
Assert.That(trackRater.RateTrack(_girlsCanTell.Tracks[0]), Is.EqualTo(10));
|
||||
Assert.That(trackRater.RateTrack(_girlsCanTell.Tracks[1]), Is.EqualTo(9));
|
||||
Assert.That(trackRater.RateTrack(_killTheMoonLight.Tracks[2]), Is.EqualTo(8));
|
||||
Assert.That(trackRater.RateTrack(_reactor.Tracks[0]), Is.EqualTo(6));
|
||||
Assert.That(trackRater.RateTrack(_reactor.Tracks[1]), Is.EqualTo(4));
|
||||
Assert.That(trackRater.RateTrack(_pulpFiction.Tracks[2]), Is.EqualTo(10));
|
||||
Assert.That(trackRater.RateTrack(_wipersBoxSet.Tracks[0]), Is.EqualTo(9));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Services;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Queries;
|
||||
using MusicMetaTagger.Core.Services;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Tests.Services
|
||||
{
|
||||
[TestFixture]
|
||||
public class TrackSimilarityTests
|
||||
{
|
||||
[Test]
|
||||
public void Similarity_Identical()
|
||||
{
|
||||
var trackQuery = new TrackQuery { TrackTitle = "track", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 34) };
|
||||
var track = new Track {TrackTitle = "track", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 34)};
|
||||
|
||||
Assert.AreEqual(1, TrackSimilarity.Similarity(trackQuery, track));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Similarity_TitleSlightlyDifferent()
|
||||
{
|
||||
var trackQuery = new TrackQuery { TrackTitle = "track", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 34) };
|
||||
var track = new Track {TrackTitle = "tracker", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 34)};
|
||||
|
||||
Assert.That(TrackSimilarity.Similarity(trackQuery, track), Is.InRange(.8, .99));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Similarity_TimeSlightlyOff()
|
||||
{
|
||||
var trackQuery = new TrackQuery { TrackTitle = "track", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 34) };
|
||||
var track = new Track {TrackTitle = "track", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 30)};
|
||||
|
||||
Assert.That(TrackSimilarity.Similarity(trackQuery, track), Is.InRange(.95, .995));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Similarity_TrackNumberWrong()
|
||||
{
|
||||
var trackQuery = new TrackQuery { TrackTitle = "track", TrackNumber = 3, TrackLength = new TimeSpan(0, 0, 2, 34) };
|
||||
var track = new Track {TrackTitle = "track", TrackNumber = 2, TrackLength = new TimeSpan(0, 0, 2, 34)};
|
||||
|
||||
Assert.That(TrackSimilarity.Similarity(trackQuery, track), Is.InRange(.7, .9));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="NSubstitute" version="1.4.3.0" targetFramework="net40" />
|
||||
<package id="NUnit" version="2.6.2" targetFramework="net40" />
|
||||
</packages>
|
||||
@@ -0,0 +1,235 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{A86C05AB-9720-4D6E-AC5E-9CDE6364945A}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>MusicMetaTagger.Client.AllMusicGuide</RootNamespace>
|
||||
<AssemblyName>MusicMetaTagger.Client.AllMusicGuide</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="HtmlAgilityPack">
|
||||
<HintPath>..\packages\HtmlAgilityPack.1.4.6\lib\Net40\HtmlAgilityPack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Services\MusicGuideCache.cs" />
|
||||
<Compile Include="Services\Searchers\AlbumArtistSearcher.cs" />
|
||||
<Compile Include="Services\Searchers\AlbumSearcher.cs" />
|
||||
<Compile Include="Services\Searchers\SongArtistSearcher.cs" />
|
||||
<Compile Include="Services\TrackOriginalRelease.cs" />
|
||||
<Compile Include="Services\TrackRater.cs" />
|
||||
<Compile Include="Services\TrackSearcher.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\AlbumClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\AlbumResultPageClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\ArtistClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\ArtistDiscographyAlbumPageClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\ArtistDiscographyCompilationPageClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\ArtistDiscographyEpSinglesPageClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\ArtistResultPageClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\IXmlClientBase.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\SongClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\SongResultPageClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\WebXmlClient.cs" />
|
||||
<Compile Include="RemoteDataAccess\Client\XmlClientBase.cs" />
|
||||
<Compile Include="RemoteDataAccess\MusicGuideScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\AlbumParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\AlbumResultPageParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\AlbumResultParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistDiscographyPageParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistDiscographyParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistResultPageParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ArtistResultParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\IParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\ParserBase.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\SongParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\SongResultPageParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\SongResultParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Parser\TrackParser.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\AlbumResultPageScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\AlbumScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\ArtistDiscographyScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\ArtistResultPageScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\ArtistScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\IScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\ScraperBase.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\SongResultPageScraper.cs" />
|
||||
<Compile Include="RemoteDataAccess\Scraper\SongScraper.cs" />
|
||||
<Compile Include="Properties\AlbumResultPageScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>AlbumResultPageScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AlbumResultScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>AlbumResultScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AlbumScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>AlbumScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AllMusicGuideSettings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>AllMusicGuideSettings.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\ArtistDiscographyPageScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>ArtistDiscographyPageScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\ArtistDiscographyScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>ArtistDiscographyScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\ArtistResultPageScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>ArtistResultPageScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\ArtistResultScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>ArtistResultScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\ArtistScaper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>ArtistScaper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Properties\SongAppearsOnAlbumScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>SongAppearsOnAlbumScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\SongResultPageScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>SongResultPageScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\SongResultScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>SongResultScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\SongScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>SongScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\TrackScraper.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>TrackScraper.settings</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\AlbumResultPageScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>AlbumResultPageScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\AlbumResultScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>AlbumResultScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\AlbumScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>AlbumScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\AllMusicGuideSettings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>AllMusicGuideSettings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\ArtistDiscographyPageScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>ArtistDiscographyPageScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\ArtistDiscographyScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>ArtistDiscographyScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\ArtistResultPageScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>ArtistResultPageScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\ArtistResultScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>ArtistResultScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\ArtistScaper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>ArtistScaper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\SongAppearsOnAlbumScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>SongAppearsOnAlbumScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\SongResultPageScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>SongResultPageScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\SongResultScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>SongResultScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\SongScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>SongScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Properties\TrackScraper.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>TrackScraper.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core\Core.csproj">
|
||||
<Project>{EDA98A07-0BF5-4FEE-B341-D8A6A7E581F5}</Project>
|
||||
<Name>Core</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,44 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18033
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class AlbumResultPageScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static AlbumResultPageScraper defaultInstance = ((AlbumResultPageScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AlbumResultPageScraper())));
|
||||
|
||||
public static AlbumResultPageScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'right-of-image\')]")]
|
||||
public string AlbumXpath {
|
||||
get {
|
||||
return ((string)(this["AlbumXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/search/ajax_results/albums/{0}")]
|
||||
public string AlbumResultUrl {
|
||||
get {
|
||||
return ((string)(this["AlbumResultUrl"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MusicMetaTagger.Client.AllMusicGuide.Properties" GeneratedClassName="AlbumResultPageScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="AlbumXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'right-of-image')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumResultUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/search/ajax_results/albums/{0}</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,116 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class AlbumResultScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static AlbumResultScraper defaultInstance = ((AlbumResultScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AlbumResultScraper())));
|
||||
|
||||
public static AlbumResultScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'title\')]/a/@href")]
|
||||
public string AlbumUrlXpath {
|
||||
get {
|
||||
return ((string)(this["AlbumUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string AlbumUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["AlbumUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]/a")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'title\')]/a")]
|
||||
public string TitleXpath {
|
||||
get {
|
||||
return ((string)(this["TitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(19|20)\\d{2}")]
|
||||
public string YearRegex {
|
||||
get {
|
||||
return ((string)(this["YearRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]/a/@href")]
|
||||
public string ArtistUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string ArtistUrIdRegex {
|
||||
get {
|
||||
return ((string)(this["ArtistUrIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]")]
|
||||
public string ArtistNoUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistNoUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'info\']")]
|
||||
public string InfoXpath {
|
||||
get {
|
||||
return ((string)(this["InfoXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(?<=\\n).*")]
|
||||
public string GenreRegex {
|
||||
get {
|
||||
return ((string)(this["GenreRegex"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="AlbumResultScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="AlbumUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'title')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="TitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'title')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="YearRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(19|20)\d{2}</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistNoUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="InfoXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='info']</Value>
|
||||
</Setting>
|
||||
<Setting Name="GenreRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(?<=\n).*</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,207 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class AlbumScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static AlbumScraper defaultInstance = ((AlbumScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AlbumScraper())));
|
||||
|
||||
public static AlbumScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'album-title\']/text()")]
|
||||
public string TitleXpath {
|
||||
get {
|
||||
return ((string)(this["TitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/album/{0}")]
|
||||
public string AlbumUrl {
|
||||
get {
|
||||
return ((string)(this["AlbumUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@id=\'tracks\']//tbody/tr[td[@class=\'tracknum\']]")]
|
||||
public string TrackXpath {
|
||||
get {
|
||||
return ((string)(this["TrackXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'image-container\']/img/@src")]
|
||||
public string CoverUrlXpath {
|
||||
get {
|
||||
return ((string)(this["CoverUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'editorial-rating\']//span[@itemprop=\'rating\']")]
|
||||
public string RatingXpath {
|
||||
get {
|
||||
return ((string)(this["RatingXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'release-date\']")]
|
||||
public string ReleaseDateXpath {
|
||||
get {
|
||||
return ((string)(this["ReleaseDateXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'album-artist\']/a")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'album-artist\']/a/@href")]
|
||||
public string ArtistUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'themes\')]//a")]
|
||||
public string ThemesXpath {
|
||||
get {
|
||||
return ((string)(this["ThemesXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'moods\')]//a")]
|
||||
public string MoodsXpath {
|
||||
get {
|
||||
return ((string)(this["MoodsXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'review-body\']/div")]
|
||||
public string ReviewXpath {
|
||||
get {
|
||||
return ((string)(this["ReviewXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@id=\'review\']//*[@class=\'author\']")]
|
||||
public string ReviewerXpath {
|
||||
get {
|
||||
return ((string)(this["ReviewerXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(?<=by\\s*).*")]
|
||||
public string ReviewerRegex {
|
||||
get {
|
||||
return ((string)(this["ReviewerRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'id-details\']//*[contains(.,\'Rovi Music ID\')]/following-sibling::*[1]/" +
|
||||
"span")]
|
||||
public string AlbumIdXpath {
|
||||
get {
|
||||
return ((string)(this["AlbumIdXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'styles\')]//a[contains(.,\'Soundtrack\')]")]
|
||||
public string SoundtrackXpath {
|
||||
get {
|
||||
return ((string)(this["SoundtrackXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("\\d{4}")]
|
||||
public string ReleaseYearRegex {
|
||||
get {
|
||||
return ((string)(this["ReleaseYearRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'styles\')]//a")]
|
||||
public string StylesXpath {
|
||||
get {
|
||||
return ((string)(this["StylesXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string ArtistUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute(".*(?=\\?.*)")]
|
||||
public string CoverUrlRegex {
|
||||
get {
|
||||
return ((string)(this["CoverUrlRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'album-pick\')]")]
|
||||
public string PickXpath {
|
||||
get {
|
||||
return ((string)(this["PickXpath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="AlbumScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="TitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='album-title']/text()</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/album/{0}</Value>
|
||||
</Setting>
|
||||
<Setting Name="TrackXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@id='tracks']//tbody/tr[td[@class='tracknum']]</Value>
|
||||
</Setting>
|
||||
<Setting Name="CoverUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='image-container']/img/@src</Value>
|
||||
</Setting>
|
||||
<Setting Name="RatingXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='editorial-rating']//span[@itemprop='rating']</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReleaseDateXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='release-date']</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='album-artist']/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='album-artist']/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ThemesXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'themes')]//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="MoodsXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'moods')]//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReviewXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='review-body']/div</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReviewerXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@id='review']//*[@class='author']</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReviewerRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(?<=by\s*).*</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumIdXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='id-details']//*[contains(.,'Rovi Music ID')]/following-sibling::*[1]/span</Value>
|
||||
</Setting>
|
||||
<Setting Name="SoundtrackXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'styles')]//a[contains(.,'Soundtrack')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReleaseYearRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">\d{4}</Value>
|
||||
</Setting>
|
||||
<Setting Name="StylesXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'styles')]//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="CoverUrlRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">.*(?=\?.*)</Value>
|
||||
</Setting>
|
||||
<Setting Name="PickXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'album-pick')]</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,50 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class AllMusicGuideSettings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static AllMusicGuideSettings defaultInstance = ((AllMusicGuideSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new AllMusicGuideSettings())));
|
||||
|
||||
public static AllMusicGuideSettings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("0.6")]
|
||||
public double AlbumResultsRelevanceThreshold {
|
||||
get {
|
||||
return ((double)(this["AlbumResultsRelevanceThreshold"]));
|
||||
}
|
||||
set {
|
||||
this["AlbumResultsRelevanceThreshold"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("0.6")]
|
||||
public double ArtistResultsRelevanceThreshold {
|
||||
get {
|
||||
return ((double)(this["ArtistResultsRelevanceThreshold"]));
|
||||
}
|
||||
set {
|
||||
this["ArtistResultsRelevanceThreshold"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ItunesAMG.AllMusicGuide" GeneratedClassName="AllMusicGuideSettings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="AlbumResultsRelevanceThreshold" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">0.6</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistResultsRelevanceThreshold" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">0.6</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,99 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18033
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class ArtistDiscographyPageScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static ArtistDiscographyPageScraper defaultInstance = ((ArtistDiscographyPageScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ArtistDiscographyPageScraper())));
|
||||
|
||||
public static ArtistDiscographyPageScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//table[contains(@class,\'album-table\')]/tbody/tr")]
|
||||
public string DiscographyXpath {
|
||||
get {
|
||||
return ((string)(this["DiscographyXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/artist/{0}/overview/main")]
|
||||
public string DiscographyAlbumUrl {
|
||||
get {
|
||||
return ((string)(this["DiscographyAlbumUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/artist/{0}/overview/singles")]
|
||||
public string DiscographyEpSinglesUrl {
|
||||
get {
|
||||
return ((string)(this["DiscographyEpSinglesUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/artist/{0}/overview/compilations")]
|
||||
public string DiscographyCompilationUrl {
|
||||
get {
|
||||
return ((string)(this["DiscographyCompilationUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@id=\"discography\"]//ul[@class=\'sub-tabs\']/li[contains(@class,\'active\')]/@clas" +
|
||||
"s")]
|
||||
public string ReleaseTypeXpath {
|
||||
get {
|
||||
return ((string)(this["ReleaseTypeXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute(".*(?=\\sactive)")]
|
||||
public string ReleaseTypeRegex {
|
||||
get {
|
||||
return ((string)(this["ReleaseTypeRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'artist-name\']/text()")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'id-details\']//*[contains(.,\'Rovi Music ID\')]/following-sibling::*[1]")]
|
||||
public string ArtistIdXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistIdXpath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MusicMetaTagger.Client.AllMusicGuide.Properties" GeneratedClassName="ArtistDiscographyPageScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="DiscographyXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//table[contains(@class,'album-table')]/tbody/tr</Value>
|
||||
</Setting>
|
||||
<Setting Name="DiscographyAlbumUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/artist/{0}/overview/main</Value>
|
||||
</Setting>
|
||||
<Setting Name="DiscographyEpSinglesUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/artist/{0}/overview/singles</Value>
|
||||
</Setting>
|
||||
<Setting Name="DiscographyCompilationUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/artist/{0}/overview/compilations</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReleaseTypeXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@id="discography"]//ul[@class='sub-tabs']/li[contains(@class,'active')]/@class</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReleaseTypeRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">.*(?=\sactive)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='artist-name']/text()</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistIdXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='id-details']//*[contains(.,'Rovi Music ID')]/following-sibling::*[1]</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,107 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class ArtistDiscographyScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static ArtistDiscographyScraper defaultInstance = ((ArtistDiscographyScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ArtistDiscographyScraper())));
|
||||
|
||||
public static ArtistDiscographyScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//td[contains(@class,\'title\')]/a[contains(@class,\'full-title\')]/@href")]
|
||||
public string AlbumUrlXpath {
|
||||
get {
|
||||
return ((string)(this["AlbumUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string AlbumUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["AlbumUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//td[@class=\'ed-rating\']/@data-sort-value")]
|
||||
public string RatingXpath {
|
||||
get {
|
||||
return ((string)(this["RatingXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//td[contains(@class,\'year\')][contains(@class,\'pick\')]")]
|
||||
public string PickXpath {
|
||||
get {
|
||||
return ((string)(this["PickXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//td[contains(@class,\'year\')]")]
|
||||
public string YearXpath {
|
||||
get {
|
||||
return ((string)(this["YearXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//td[contains(@class,\'title\')]/a[contains(@class,\'full-title\')]")]
|
||||
public string TitleXpath {
|
||||
get {
|
||||
return ((string)(this["TitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//td[@class=\'label\']/*[@class=\'full-title\']")]
|
||||
public string LabelXpath {
|
||||
get {
|
||||
return ((string)(this["LabelXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(?<=\\s*\\[).*(?=\\]$)")]
|
||||
public string ReleaseTypeRegex {
|
||||
get {
|
||||
return ((string)(this["ReleaseTypeRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("\\d{1,2}")]
|
||||
public string RatingRegex {
|
||||
get {
|
||||
return ((string)(this["RatingRegex"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="ArtistDiscographyScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="AlbumUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//td[contains(@class,'title')]/a[contains(@class,'full-title')]/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="RatingXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//td[@class='ed-rating']/@data-sort-value</Value>
|
||||
</Setting>
|
||||
<Setting Name="PickXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//td[contains(@class,'year')][contains(@class,'pick')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="YearXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//td[contains(@class,'year')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="TitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//td[contains(@class,'title')]/a[contains(@class,'full-title')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="LabelXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//td[@class='label']/*[@class='full-title']</Value>
|
||||
</Setting>
|
||||
<Setting Name="ReleaseTypeRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(?<=\s*\[).*(?=\]$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="RatingRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">\d{1,2}</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,44 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18033
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class ArtistResultPageScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static ArtistResultPageScraper defaultInstance = ((ArtistResultPageScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ArtistResultPageScraper())));
|
||||
|
||||
public static ArtistResultPageScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/search/ajax_results/artists/{0}")]
|
||||
public string ArtistResultUrl {
|
||||
get {
|
||||
return ((string)(this["ArtistResultUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'right-of-image\')]")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MusicMetaTagger.Client.AllMusicGuide.Properties" GeneratedClassName="ArtistResultPageScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="ArtistResultUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/search/ajax_results/artists/{0}</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'right-of-image')]</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,80 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class ArtistResultScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static ArtistResultScraper defaultInstance = ((ArtistResultScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ArtistResultScraper())));
|
||||
|
||||
public static ArtistResultScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'name\')]/a/@href")]
|
||||
public string ArtistUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string ArtistUrIdRegex {
|
||||
get {
|
||||
return ((string)(this["ArtistUrIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'name\')]/a")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'info\']")]
|
||||
public string InfoXpath {
|
||||
get {
|
||||
return ((string)(this["InfoXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute(".*(?=\\n)*")]
|
||||
public string GenreRegex {
|
||||
get {
|
||||
return ((string)(this["GenreRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(?<=\\n).*(19|20)\\d{2}.*")]
|
||||
public string YearsActiveRegex {
|
||||
get {
|
||||
return ((string)(this["YearsActiveRegex"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="ArtistResultScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="ArtistUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'name')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'name')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="InfoXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='info']</Value>
|
||||
</Setting>
|
||||
<Setting Name="GenreRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">.*(?=\n)*</Value>
|
||||
</Setting>
|
||||
<Setting Name="YearsActiveRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(?<=\n).*(19|20)\d{2}.*</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,80 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18033
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class ArtistScaper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static ArtistScaper defaultInstance = ((ArtistScaper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ArtistScaper())));
|
||||
|
||||
public static ArtistScaper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/artist/{0}")]
|
||||
public string ArtistUrl {
|
||||
get {
|
||||
return ((string)(this["ArtistUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/artist/{0}/overview/main")]
|
||||
public string DiscographyAlbumUrl {
|
||||
get {
|
||||
return ((string)(this["DiscographyAlbumUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'id-details\']//*[contains(.,\'Rovi Music ID\')]/following-sibling::*[1]")]
|
||||
public string ArtistIdXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistIdXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'genres\']//a")]
|
||||
public string GenreXpath {
|
||||
get {
|
||||
return ((string)(this["GenreXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'styles\']//a")]
|
||||
public string StylesXpath {
|
||||
get {
|
||||
return ((string)(this["StylesXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'artist-name\']/text()")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MusicMetaTagger.Client.AllMusicGuide.Properties" GeneratedClassName="ArtistScaper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="ArtistUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/artist/{0}</Value>
|
||||
</Setting>
|
||||
<Setting Name="DiscographyAlbumUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/artist/{0}/overview/main</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistIdXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='id-details']//*[contains(.,'Rovi Music ID')]/following-sibling::*[1]</Value>
|
||||
</Setting>
|
||||
<Setting Name="GenreXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='genres']//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="StylesXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='styles']//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='artist-name']/text()</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("MusicMetaTagger.Client.AllMusicGuide")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("MusicMetaTagger.Client.AllMusicGuide")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2012")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("26de737f-4e88-484b-95ab-f4edec53c9ee")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,107 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class SongAppearsOnAlbumScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static SongAppearsOnAlbumScraper defaultInstance = ((SongAppearsOnAlbumScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new SongAppearsOnAlbumScraper())));
|
||||
|
||||
public static SongAppearsOnAlbumScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'title\')]/a/@href")]
|
||||
public string AlbumUrlXpath {
|
||||
get {
|
||||
return ((string)(this["AlbumUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string AlbumUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["AlbumUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]/a")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'title\')]/a")]
|
||||
public string TitleXpath {
|
||||
get {
|
||||
return ((string)(this["TitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(19|20)\\d{2}")]
|
||||
public string YearRegex {
|
||||
get {
|
||||
return ((string)(this["YearRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]/a/@href")]
|
||||
public string ArtistUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string ArtistUrIdRegex {
|
||||
get {
|
||||
return ((string)(this["ArtistUrIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]")]
|
||||
public string ArtistNoUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistNoUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'year\']")]
|
||||
public string YearXpath {
|
||||
get {
|
||||
return ((string)(this["YearXpath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="SongAppearsOnAlbumScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="AlbumUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'title')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="TitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'title')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="YearRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(19|20)\d{2}</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistNoUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="YearXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='year']</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,47 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18033
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class SongResultPageScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static SongResultPageScraper defaultInstance = ((SongResultPageScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new SongResultPageScraper())));
|
||||
|
||||
public static SongResultPageScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/search/ajax_results/songs/{0}")]
|
||||
public string SongResultUrl {
|
||||
get {
|
||||
return ((string)(this["SongResultUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'right-of-image\')]")]
|
||||
public string SongXpath {
|
||||
get {
|
||||
return ((string)(this["SongXpath"]));
|
||||
}
|
||||
set {
|
||||
this["SongXpath"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MusicMetaTagger.Client.AllMusicGuide.Properties" GeneratedClassName="SongResultPageScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="SongResultUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/search/ajax_results/songs/{0}</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongXpath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">//*[contains(@class,'right-of-image')]</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,89 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class SongResultScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static SongResultScraper defaultInstance = ((SongResultScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new SongResultScraper())));
|
||||
|
||||
public static SongResultScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'title\')]/a")]
|
||||
public string SongTitleXpath {
|
||||
get {
|
||||
return ((string)(this["SongTitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string SongUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["SongUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'performer\')]/a/@href")]
|
||||
public string ArtistUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string ArtistUrIdRegex {
|
||||
get {
|
||||
return ((string)(this["ArtistUrIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'title\')]/a/@href")]
|
||||
public string SongUrlIdXpath {
|
||||
get {
|
||||
return ((string)(this["SongUrlIdXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'performer\')]/a")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("(?<=^\").*(?=\"$)")]
|
||||
public string SongTitleRegex {
|
||||
get {
|
||||
return ((string)(this["SongTitleRegex"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="SongResultScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="SongTitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'title')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'performer')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongUrlIdXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'title')]/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'performer')]/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongTitleRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">(?<=^").*(?="$)</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,98 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.18033
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class SongScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static SongScraper defaultInstance = ((SongScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new SongScraper())));
|
||||
|
||||
public static SongScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'song-title\']")]
|
||||
public string SongTitleXpath {
|
||||
get {
|
||||
return ((string)(this["SongTitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string SongUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["SongUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'song-artist\']/a/@href")]
|
||||
public string ArtistUrlXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string ArtistUrIdRegex {
|
||||
get {
|
||||
return ((string)(this["ArtistUrIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//link[@rel=\'canonical\']/@href")]
|
||||
public string SongUrlIdXpath {
|
||||
get {
|
||||
return ((string)(this["SongUrlIdXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'song-artist\']/a")]
|
||||
public string ArtistXpath {
|
||||
get {
|
||||
return ((string)(this["ArtistXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("http://www.allmusic.com/song/{0}")]
|
||||
public string SongUrl {
|
||||
get {
|
||||
return ((string)(this["SongUrl"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@id=\'appearances\']//tbody/tr")]
|
||||
public string AlbumXpath {
|
||||
get {
|
||||
return ((string)(this["AlbumXpath"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="MusicMetaTagger.Client.AllMusicGuide.Properties" GeneratedClassName="SongScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="SongTitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='song-title']</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='song-artist']/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistUrIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongUrlIdXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//link[@rel='canonical']/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="ArtistXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='song-artist']/a</Value>
|
||||
</Setting>
|
||||
<Setting Name="SongUrl" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">http://www.allmusic.com/song/{0}</Value>
|
||||
</Setting>
|
||||
<Setting Name="AlbumXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@id='appearances']//tbody/tr</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,122 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.269
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class TrackScraper : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static TrackScraper defaultInstance = ((TrackScraper)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new TrackScraper())));
|
||||
|
||||
public static TrackScraper Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'pick\')]")]
|
||||
public string PickXpath {
|
||||
get {
|
||||
return ((string)(this["PickXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'tracknum\']")]
|
||||
public string TrackNumberXpath {
|
||||
get {
|
||||
return ((string)(this["TrackNumberXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'title\']//a/@href")]
|
||||
public string TrackUrlXpath {
|
||||
get {
|
||||
return ((string)(this["TrackUrlXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string TrackUrlIdRegex {
|
||||
get {
|
||||
return ((string)(this["TrackUrlIdRegex"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'title\']//a")]
|
||||
public string TitleXpath {
|
||||
get {
|
||||
return ((string)(this["TitleXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'artist\')]//a")]
|
||||
public string ComposerXpath {
|
||||
get {
|
||||
return ((string)(this["ComposerXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[@class=\'time\']")]
|
||||
public string TimeXpath {
|
||||
get {
|
||||
return ((string)(this["TimeXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'performer\')]/*[@class=\'primary\']/a/@href")]
|
||||
public string PerformerIdXpath {
|
||||
get {
|
||||
return ((string)(this["PerformerIdXpath"]));
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("[a-zA-Z]{2}[0-9]+(?=$)")]
|
||||
public string PerformerIdRegex {
|
||||
get {
|
||||
return ((string)(this["PerformerIdRegex"]));
|
||||
}
|
||||
set {
|
||||
this["PerformerIdRegex"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("//*[contains(@class,\'performer\')]//a/@href")]
|
||||
public string PerformerIdAlternateXpath {
|
||||
get {
|
||||
return ((string)(this["PerformerIdAlternateXpath"]));
|
||||
}
|
||||
set {
|
||||
this["PerformerIdAlternateXpath"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="AllMusicGuide.Client.Properties" GeneratedClassName="TrackScraper">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="PickXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'pick')]</Value>
|
||||
</Setting>
|
||||
<Setting Name="TrackNumberXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='tracknum']</Value>
|
||||
</Setting>
|
||||
<Setting Name="TrackUrlXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='title']//a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="TrackUrlIdRegex" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="TitleXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='title']//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="ComposerXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'artist')]//a</Value>
|
||||
</Setting>
|
||||
<Setting Name="TimeXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[@class='time']</Value>
|
||||
</Setting>
|
||||
<Setting Name="PerformerIdXpath" Type="System.String" Scope="Application">
|
||||
<Value Profile="(Default)">//*[contains(@class,'performer')]/*[@class='primary']/a/@href</Value>
|
||||
</Setting>
|
||||
<Setting Name="PerformerIdRegex" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">[a-zA-Z]{2}[0-9]+(?=$)</Value>
|
||||
</Setting>
|
||||
<Setting Name="PerformerIdAlternateXpath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">//*[contains(@class,'performer')]//a/@href</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class AlbumClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string albumId)
|
||||
{
|
||||
var settings = AlbumScraper.Default;
|
||||
return ReadFromCriteria(settings.AlbumUrl, albumId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class AlbumResultPageClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string criteria)
|
||||
{
|
||||
var settings = AlbumResultPageScraper.Default;
|
||||
return ReadFromCriteria(settings.AlbumResultUrl, criteria);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class ArtistClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string artistId)
|
||||
{
|
||||
var settings = ArtistScaper.Default;
|
||||
return ReadFromCriteria(settings.ArtistUrl, artistId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class ArtistDiscographyAlbumPageClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string artistId)
|
||||
{
|
||||
var settings = ArtistDiscographyPageScraper.Default;
|
||||
return ReadFromCriteria(settings.DiscographyAlbumUrl, artistId);
|
||||
}
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class ArtistDiscographyCompilationPageClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string artistId)
|
||||
{
|
||||
var settings = ArtistDiscographyPageScraper.Default;
|
||||
return ReadFromCriteria(settings.DiscographyCompilationUrl, artistId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class ArtistDiscographyEpSinglesPageClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string artistId)
|
||||
{
|
||||
var settings = ArtistDiscographyPageScraper.Default;
|
||||
return ReadFromCriteria(settings.DiscographyEpSinglesUrl, artistId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class ArtistResultPageClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string criteria)
|
||||
{
|
||||
var settings = ArtistResultPageScraper.Default;
|
||||
return ReadFromCriteria(settings.ArtistResultUrl, criteria);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using System.Xml;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public interface IXmlClientBase
|
||||
{
|
||||
XmlDocument Read(string criteria);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class SongClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string criteria)
|
||||
{
|
||||
var settings = SongScraper.Default;
|
||||
return ReadFromCriteria(settings.SongUrl, criteria);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public class SongResultPageClient : XmlClientBase
|
||||
{
|
||||
public override XmlDocument Read(string criteria)
|
||||
{
|
||||
var settings = SongResultPageScraper.Default;
|
||||
return ReadFromCriteria(settings.SongResultUrl, criteria);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Xml;
|
||||
using HtmlAgilityPack;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public static class WebXmlClient
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns the HTML grabbed from the passed in URL.
|
||||
/// </summary>
|
||||
/// <param name="url"> The URL. </param>
|
||||
/// <returns> A string containing html </returns>
|
||||
public static string GetHtml(Uri url)
|
||||
{
|
||||
var tries = 0;
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var client = new WebClient();
|
||||
using (var data = client.OpenRead(url))
|
||||
using (var reader = new StreamReader(data))
|
||||
{
|
||||
return reader.ReadToEnd();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (tries++ > 3)
|
||||
throw new WebException(ex.Message + " : " + url, ex);
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void SaveFile(Uri url, string filename)
|
||||
{
|
||||
var client = new WebClient();
|
||||
client.DownloadFile(url, filename);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the HTML parsed into a standard XmlDocument. Uses the HtmlAgilityPack library for "out of the web" (poorly formatted) html file support.
|
||||
/// </summary>
|
||||
/// <param name="html"> The HTML </param>
|
||||
/// <returns> An XmlDocument from the HTML </returns>
|
||||
public static XmlDocument GetHtmlXml(string html)
|
||||
{
|
||||
// Sometimes the biography will have "<..." in it. Annoying.
|
||||
html = html.Replace("<...", "");
|
||||
html = html.Replace("<class=\"subtitle\">", "");
|
||||
html = html.Replace("< ", "");
|
||||
|
||||
var htmlDoc = new HtmlDocument {OptionOutputAsXml = true};
|
||||
htmlDoc.LoadHtml(html);
|
||||
// this element will have unencoded entities in an attribute, messing up the xml
|
||||
var selectSingleNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@class='rovi-share']");
|
||||
if (selectSingleNode != null)
|
||||
selectSingleNode.Remove();
|
||||
selectSingleNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='similar-albums']");
|
||||
if (selectSingleNode != null)
|
||||
selectSingleNode.Remove();
|
||||
// fix for ajax results having more than one root node
|
||||
if (htmlDoc.DocumentNode.ChildNodes.All(n => n.Name != "html"))
|
||||
{
|
||||
var el = htmlDoc.CreateElement("html");
|
||||
var nodes = htmlDoc.DocumentNode.ChildNodes;
|
||||
el.AppendChildren(nodes);
|
||||
htmlDoc.DocumentNode.RemoveAllChildren();
|
||||
htmlDoc.DocumentNode.AppendChild(el);
|
||||
}
|
||||
|
||||
var xmlDocument = new XmlDocument();
|
||||
using (Stream stream = new MemoryStream())
|
||||
using (var xmlTextWriter = new XmlTextWriter(stream, Encoding.UTF8))
|
||||
{
|
||||
htmlDoc.Save(xmlTextWriter);
|
||||
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
using (var streamReader = new StreamReader(stream))
|
||||
xmlDocument.Load(streamReader);
|
||||
}
|
||||
return xmlDocument;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the HTML grabbed from the passed in URL parsed into a standard XmlDocument. Uses the HtmlAgilityPack library for "out of the web" html file support.
|
||||
/// </summary>
|
||||
/// <param name="url"> The URL. </param>
|
||||
/// <returns> An XmlDocument from the HTML </returns>
|
||||
public static XmlDocument GetHtmlXml(Uri url)
|
||||
{
|
||||
return GetHtmlXml(GetHtml(url));
|
||||
}
|
||||
|
||||
// TODO: Refactor!
|
||||
/// <summary>
|
||||
/// Downloads the cover art to a local file. If the album doesn't have cover art, this will return null.
|
||||
/// </summary>
|
||||
/// <exception cref="HttpException">Thrown on HTTP error.</exception>
|
||||
/// <returns> </returns>
|
||||
public static FileInfo DownloadCoverArt(Album album)
|
||||
{
|
||||
if (String.IsNullOrEmpty(album.CoverUrl))
|
||||
return null;
|
||||
if (album.CoverUrl.Contains("no_cover"))
|
||||
return null;
|
||||
|
||||
var directoryInfo = new DirectoryInfo(".\\ImageCache");
|
||||
if (!Directory.Exists(directoryInfo.FullName))
|
||||
directoryInfo.Create();
|
||||
|
||||
var fileInfo = new FileInfo(directoryInfo.FullName + "\\" + album.AlbumId + ".jpg");
|
||||
|
||||
if (!fileInfo.Exists)
|
||||
SaveFile(new Uri(album.CoverUrl), fileInfo.FullName);
|
||||
|
||||
return fileInfo;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Xml;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client
|
||||
{
|
||||
public abstract class XmlClientBase : IXmlClientBase
|
||||
{
|
||||
public abstract XmlDocument Read(string criteria);
|
||||
|
||||
protected static XmlDocument ReadFromCriteria(string urlFormat, string criteria)
|
||||
{
|
||||
|
||||
if (String.IsNullOrEmpty(criteria))
|
||||
return new XmlDocument();
|
||||
//throw new ArgumentNullException("criteria");
|
||||
|
||||
criteria = Uri.EscapeUriString(criteria);
|
||||
var url = String.Format(urlFormat, criteria);
|
||||
return WebXmlClient.GetHtmlXml(new Uri(url));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using System.Collections.Generic;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Services;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess
|
||||
{
|
||||
/// <summary>
|
||||
/// Inspired by this Perl module: http://backpan.perl.org/authors/id/Y/YO/YOHAMED/WWW-AllMusicGuide.html
|
||||
/// </summary>
|
||||
public class MusicGuideScraper : IMusicGuide
|
||||
{
|
||||
private readonly IScraper<Album> _albumScraper;
|
||||
private readonly IScraper<List<AlbumResult>> _albumResultScraper;
|
||||
private readonly IScraper<Artist> _artistScraper;
|
||||
private readonly IScraper<List<ArtistResult>> _artistResultScraper;
|
||||
private readonly IScraper<List<ArtistDiscography>> _discographyScraper;
|
||||
|
||||
private readonly IScraper<List<SongResult>> _songResultScraper;
|
||||
private readonly IScraper<Song> _songScraper;
|
||||
|
||||
public MusicGuideScraper(IScraper<Album> albumScraper, IScraper<List<AlbumResult>> albumResultScraper, IScraper<Artist> artistScraper, IScraper<List<ArtistResult>> artistResultScraper, IScraper<List<ArtistDiscography>> discographyScraper, IScraper<List<SongResult>> songResultScraper, IScraper<Song> songScraper)
|
||||
{
|
||||
_albumScraper = albumScraper;
|
||||
_albumResultScraper = albumResultScraper;
|
||||
_artistScraper = artistScraper;
|
||||
_artistResultScraper = artistResultScraper;
|
||||
_discographyScraper = discographyScraper;
|
||||
_songResultScraper = songResultScraper;
|
||||
_songScraper = songScraper;
|
||||
}
|
||||
|
||||
public Artist GetArtist(string artistId)
|
||||
{
|
||||
var artist = _artistScraper.Scrape(artistId);
|
||||
artist.Discography = _discographyScraper.Scrape(artistId);
|
||||
return artist;
|
||||
}
|
||||
|
||||
public Album GetAlbum(string albumId)
|
||||
{
|
||||
return _albumScraper.Scrape(albumId);
|
||||
}
|
||||
|
||||
public Song GetSong(string songId)
|
||||
{
|
||||
return _songScraper.Scrape(songId);
|
||||
}
|
||||
|
||||
public List<ArtistResult> SearchArtist(string artistName)
|
||||
{
|
||||
return _artistResultScraper.Scrape(artistName);
|
||||
}
|
||||
|
||||
public List<AlbumResult> SearchAlbum(string albumName)
|
||||
{
|
||||
return _albumResultScraper.Scrape(albumName);
|
||||
}
|
||||
|
||||
public List<SongResult> SearchSong(string songName)
|
||||
{
|
||||
return _songResultScraper.Scrape(songName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Utility;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class AlbumParser : ParserBase<Album>
|
||||
{
|
||||
public override Album Parse(XmlDocument xml)
|
||||
{
|
||||
var album = new Album();
|
||||
var settings = AlbumScraper.Default;
|
||||
|
||||
if (XpathMatch(xml, settings.ArtistUrlXpath))
|
||||
{
|
||||
var artistUrl = XpathMatchString(xml, settings.ArtistUrlXpath);
|
||||
album.ArtistId = RegexCapture(artistUrl, settings.ArtistUrlIdRegex);
|
||||
album.ArtistName = XpathMatchString(xml, settings.ArtistXpath);
|
||||
}
|
||||
else
|
||||
{
|
||||
album.VariousArtists = true;
|
||||
album.ArtistName = "Various Artists";
|
||||
}
|
||||
|
||||
if (XpathMatch(xml, settings.SoundtrackXpath))
|
||||
{
|
||||
album.Soundtrack = true;
|
||||
}
|
||||
|
||||
var albumId = XpathMatchString(xml, settings.AlbumIdXpath);
|
||||
album.AlbumId = StringUtility.CleanId(albumId);
|
||||
|
||||
album.Title = XpathMatchString(xml, settings.TitleXpath);
|
||||
if (XpathMatch(xml, settings.ReleaseDateXpath))
|
||||
album.ReleaseDate = XpathMatchString(xml, settings.ReleaseDateXpath);
|
||||
|
||||
//rating
|
||||
if (XpathMatch(xml, settings.RatingXpath))
|
||||
{
|
||||
float rating;
|
||||
if (float.TryParse(XpathMatchString(xml, settings.RatingXpath), out rating))
|
||||
album.Rating = Convert.ToInt32(rating*2);
|
||||
}
|
||||
|
||||
if (XpathMatch(xml, settings.PickXpath))
|
||||
album.Pick = true;
|
||||
|
||||
if (XpathMatch(xml, settings.CoverUrlXpath))
|
||||
{
|
||||
var coverUrl = XpathMatchString(xml, settings.CoverUrlXpath);
|
||||
album.CoverUrl = RegexCapture(coverUrl, settings.CoverUrlRegex);
|
||||
}
|
||||
if (XpathMatch(xml, settings.ReviewXpath))
|
||||
album.Review = XpathMatchString(xml, settings.ReviewXpath);
|
||||
|
||||
if (XpathMatch(xml, settings.ReviewerXpath))
|
||||
{
|
||||
var reviewer = XpathMatchString(xml, settings.ReviewerXpath);
|
||||
album.Reviewer = RegexCapture(reviewer, settings.ReviewerRegex).Trim();
|
||||
}
|
||||
|
||||
if (XpathMatch(xml, settings.StylesXpath))
|
||||
album.Styles = XpathMatchStringList(xml, settings.StylesXpath);
|
||||
if (XpathMatch(xml, settings.MoodsXpath))
|
||||
album.Moods = XpathMatchStringList(xml, settings.MoodsXpath);
|
||||
if (XpathMatch(xml, settings.ThemesXpath))
|
||||
album.Themes = XpathMatchStringList(xml, settings.ThemesXpath);
|
||||
|
||||
album.Tracks = new List<Track>();
|
||||
|
||||
if (XpathMatch(xml, settings.TrackXpath))
|
||||
{
|
||||
var trackParser = new TrackParser();
|
||||
var tracks =
|
||||
from tXml in XpathMatchXmlList(xml, settings.TrackXpath)
|
||||
let t = trackParser.Parse(tXml)
|
||||
where t.PerformerIds.Any() && t.TrackLength > TimeSpan.MinValue
|
||||
select t;
|
||||
|
||||
foreach (var track in tracks)
|
||||
{
|
||||
track.AlbumId = album.AlbumId;
|
||||
album.Tracks.Add(track);
|
||||
}
|
||||
}
|
||||
return album;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class AlbumResultPageParser : ParserBase<List<AlbumResult>>
|
||||
{
|
||||
public override List<AlbumResult> Parse(XmlDocument xml)
|
||||
{
|
||||
var albumResults = new List<AlbumResult>();
|
||||
var settings = AlbumResultPageScraper.Default;
|
||||
var albumResultScraper = new AlbumResultParser();
|
||||
|
||||
if (XpathMatch(xml, settings.AlbumXpath))
|
||||
{
|
||||
var albumResultInfoXmlList = XpathMatchXmlList(xml, settings.AlbumXpath);
|
||||
albumResults.AddRange(albumResultInfoXmlList.Select(albumResultScraper.Parse));
|
||||
var i = 1;
|
||||
albumResults.ForEach(ar => ar.ResultOrder = i++);
|
||||
}
|
||||
return albumResults;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class AlbumResultParser : ParserBase<AlbumResult>
|
||||
{
|
||||
public override AlbumResult Parse(XmlDocument xml)
|
||||
{
|
||||
var albumResult = new AlbumResult();
|
||||
var settings = AlbumResultScraper.Default;
|
||||
|
||||
var albumUrl = XpathMatchString(xml, settings.AlbumUrlXpath);
|
||||
albumResult.AlbumId = RegexCapture(albumUrl, settings.AlbumUrlIdRegex);
|
||||
|
||||
if (XpathMatch(xml, settings.InfoXpath))
|
||||
{
|
||||
var infoRaw = XpathMatchString(xml, settings.InfoXpath);
|
||||
if (RegexMatch(infoRaw, settings.YearRegex))
|
||||
{
|
||||
var year = RegexCapture(infoRaw, settings.YearRegex);
|
||||
int yearInt;
|
||||
if (Int32.TryParse(year, out yearInt))
|
||||
albumResult.Year = yearInt;
|
||||
}
|
||||
if (RegexMatch(infoRaw, settings.GenreRegex))
|
||||
{
|
||||
var genre = RegexCapture(infoRaw, settings.GenreRegex);
|
||||
albumResult.Genre = genre.Trim();
|
||||
}
|
||||
}
|
||||
|
||||
if (XpathMatch(xml, settings.ArtistUrlXpath))
|
||||
{
|
||||
var artistId = XpathMatchString(xml, settings.ArtistUrlXpath);
|
||||
albumResult.ArtistId = RegexCapture(artistId, settings.ArtistUrIdRegex);
|
||||
albumResult.ArtistName = XpathMatchString(xml, settings.ArtistXpath);
|
||||
}
|
||||
else if (XpathMatch(xml, settings.ArtistNoUrlXpath))
|
||||
{
|
||||
albumResult.ArtistName = XpathMatchString(xml, settings.ArtistNoUrlXpath);
|
||||
}
|
||||
|
||||
albumResult.AlbumTitle = XpathMatchString(xml, settings.TitleXpath);
|
||||
|
||||
return albumResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Utility;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class ArtistDiscographyPageParser : ParserBase<List<ArtistDiscography>>
|
||||
{
|
||||
public override List<ArtistDiscography> Parse(XmlDocument xml)
|
||||
{
|
||||
var artistDiscographies = new List<ArtistDiscography>();
|
||||
var settings = ArtistDiscographyPageScraper.Default;
|
||||
|
||||
if (XpathMatch(xml, settings.DiscographyXpath))
|
||||
{
|
||||
var releaseTypeStr = XpathMatchString(xml, settings.ReleaseTypeXpath);
|
||||
releaseTypeStr = RegexCapture(releaseTypeStr, settings.ReleaseTypeRegex);
|
||||
|
||||
ReleaseType releaseType;
|
||||
switch (releaseTypeStr)
|
||||
{
|
||||
case "main":
|
||||
releaseType = ReleaseType.Album;
|
||||
break;
|
||||
case "singles":
|
||||
releaseType = ReleaseType.Single;
|
||||
break;
|
||||
case "compilations":
|
||||
releaseType = ReleaseType.Compilation;
|
||||
break;
|
||||
default:
|
||||
throw new ApplicationException("Unknown release type");
|
||||
}
|
||||
|
||||
var discographyParser = new ArtistDiscographyParser(releaseType);
|
||||
artistDiscographies.AddRange(
|
||||
from albumXml in XpathMatchXmlList(xml, settings.DiscographyXpath)
|
||||
let album = discographyParser.Parse(albumXml)
|
||||
where album.Year > 0
|
||||
select album);
|
||||
|
||||
var artistId = StringUtility.CleanId(XpathMatchString(xml, settings.ArtistIdXpath));
|
||||
var artistName = XpathMatchString(xml, settings.ArtistXpath);
|
||||
|
||||
foreach (var artistDiscography in artistDiscographies)
|
||||
{
|
||||
artistDiscography.ArtistId = artistId;
|
||||
artistDiscography.ArtistName = artistName;
|
||||
}
|
||||
}
|
||||
return artistDiscographies;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Utility;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class ArtistDiscographyParser : ParserBase<ArtistDiscography>
|
||||
{
|
||||
private readonly ReleaseType _releaseType;
|
||||
|
||||
public ArtistDiscographyParser(ReleaseType releaseType)
|
||||
{
|
||||
_releaseType = releaseType;
|
||||
}
|
||||
|
||||
public override ArtistDiscography Parse(XmlDocument xml)
|
||||
{
|
||||
var artistDiscography = new ArtistDiscography();
|
||||
var settings = ArtistDiscographyScraper.Default;
|
||||
|
||||
var albumUrl = XpathMatchString(xml, settings.AlbumUrlXpath);
|
||||
artistDiscography.AlbumId = RegexCapture(albumUrl, settings.AlbumUrlIdRegex);
|
||||
|
||||
var year = XpathMatchString(xml, settings.YearXpath);
|
||||
if (year.Length > 0 && StringUtility.IsNumeric(year))
|
||||
artistDiscography.Year = Convert.ToInt32(XpathMatchString(xml, settings.YearXpath));
|
||||
|
||||
//rating
|
||||
if (XpathMatch(xml, settings.RatingXpath))
|
||||
{
|
||||
var ratingString = XpathMatchString(xml, settings.RatingXpath);
|
||||
if (!string.IsNullOrEmpty(ratingString))
|
||||
{
|
||||
ratingString = RegexCapture(ratingString, settings.RatingRegex);
|
||||
int rating;
|
||||
if (int.TryParse(ratingString, out rating))
|
||||
artistDiscography.Rating = Convert.ToInt32(rating);
|
||||
}
|
||||
}
|
||||
|
||||
artistDiscography.Pick = XpathMatch(xml, settings.PickXpath);
|
||||
|
||||
if (XpathMatch(xml, settings.LabelXpath))
|
||||
artistDiscography.Label = XpathMatchString(xml, settings.LabelXpath);
|
||||
|
||||
artistDiscography.AlbumTitle = XpathMatchString(xml, settings.TitleXpath);
|
||||
|
||||
artistDiscography.ReleaseType = _releaseType;
|
||||
// EPs will have "[EP]" after the title
|
||||
if (RegexMatch(artistDiscography.AlbumTitle, settings.ReleaseTypeRegex))
|
||||
{
|
||||
var releaseType = RegexCapture(artistDiscography.AlbumTitle, settings.ReleaseTypeRegex);
|
||||
if (releaseType == "EP")
|
||||
artistDiscography.ReleaseType = ReleaseType.EP;
|
||||
}
|
||||
else if (artistDiscography.AlbumTitle.Contains("Box Set"))
|
||||
artistDiscography.ReleaseType = ReleaseType.BoxSet;
|
||||
|
||||
// TODO: add "has review"
|
||||
|
||||
return artistDiscography;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
using MusicMetaTagger.Core.Utility;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class ArtistParser : ParserBase<Artist>
|
||||
{
|
||||
public override Artist Parse(XmlDocument artistXml)
|
||||
{
|
||||
var scraper = ArtistScaper.Default;
|
||||
var artist = new Artist();
|
||||
|
||||
artist.ArtistId = StringUtility.CleanId(XpathMatchString(artistXml, scraper.ArtistIdXpath));
|
||||
artist.ArtistName = XpathMatchString(artistXml, scraper.ArtistXpath);
|
||||
|
||||
if (XpathMatch(artistXml, scraper.GenreXpath))
|
||||
artist.Genre = XpathMatchString(artistXml, scraper.GenreXpath);
|
||||
|
||||
artist.Styles =
|
||||
XpathMatch(artistXml, scraper.StylesXpath)
|
||||
? XpathMatchStringList(artistXml, scraper.StylesXpath)
|
||||
: new List<string>();
|
||||
|
||||
return artist;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class ArtistResultPageParser : ParserBase<List<ArtistResult>>
|
||||
{
|
||||
public override List<ArtistResult> Parse(XmlDocument xml)
|
||||
{
|
||||
var artistResults = new List<ArtistResult>();
|
||||
var settings = ArtistResultPageScraper.Default;
|
||||
var artistResultParser = new ArtistResultParser();
|
||||
|
||||
if (XpathMatch(xml, settings.ArtistXpath))
|
||||
{
|
||||
var artistResultsXmlList = XpathMatchXmlList(xml, settings.ArtistXpath);
|
||||
artistResults = artistResultsXmlList.Select(artistResultParser.Parse).ToList();
|
||||
var i = 1;
|
||||
artistResults.ForEach(ar => ar.ResultOrder = i++);
|
||||
}
|
||||
return artistResults;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class ArtistResultParser : ParserBase<ArtistResult>
|
||||
{
|
||||
public override ArtistResult Parse(XmlDocument xml)
|
||||
{
|
||||
var artistResult = new ArtistResult();
|
||||
var settings = ArtistResultScraper.Default;
|
||||
|
||||
var artistId = XpathMatchString(xml, settings.ArtistUrlXpath);
|
||||
artistResult.ArtistId = RegexCapture(artistId, settings.ArtistUrIdRegex);
|
||||
|
||||
artistResult.ArtistName = XpathMatchString(xml, settings.ArtistXpath);
|
||||
if (XpathMatch(xml, settings.InfoXpath))
|
||||
{
|
||||
var infoRaw = XpathMatchString(xml, settings.InfoXpath);
|
||||
if (RegexMatch(infoRaw, settings.YearsActiveRegex))
|
||||
{
|
||||
var yearsActive = RegexCapture(infoRaw, settings.YearsActiveRegex);
|
||||
artistResult.YearsActive = yearsActive.Trim();
|
||||
}
|
||||
if (RegexMatch(infoRaw, settings.GenreRegex))
|
||||
{
|
||||
var genre = RegexCapture(infoRaw, settings.GenreRegex);
|
||||
artistResult.Genre = genre.Trim();
|
||||
}
|
||||
}
|
||||
return artistResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using System.Xml;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public interface IParser<out TEntity>
|
||||
{
|
||||
TEntity Parse(XmlDocument xml);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public abstract class ParserBase<TEntity> : IParser<TEntity>
|
||||
{
|
||||
public abstract TEntity Parse(XmlDocument xml);
|
||||
|
||||
protected static string RegexCapture(string str, string regexStr)
|
||||
{
|
||||
var regex = new Regex(regexStr);
|
||||
var match = regex.Match(str);
|
||||
if (match.Captures.Count == 0)
|
||||
throw new ApplicationException("Couldn't make regex match for "
|
||||
+ regexStr + " in " + str);
|
||||
return match.Captures[0].Value;
|
||||
}
|
||||
|
||||
protected static bool RegexMatch(string str, string regexStr)
|
||||
{
|
||||
var regex = new Regex(regexStr);
|
||||
var match = regex.Match(str);
|
||||
return match.Captures.Count > 0;
|
||||
}
|
||||
|
||||
protected static bool XpathMatch(XmlDocument xml, string xPath)
|
||||
{
|
||||
var nodes = xml.SelectNodes(xPath);
|
||||
return nodes != null && nodes.Count > 0;
|
||||
}
|
||||
|
||||
protected static string XpathMatchString(XmlDocument xml, string xPath)
|
||||
{
|
||||
var titleNodes = xml.SelectNodes(xPath);
|
||||
if (titleNodes == null || titleNodes.Count == 0)
|
||||
{
|
||||
//xml.Save(@"problem_" + DateTime.Now.Ticks + ".xml");
|
||||
throw new ApplicationException(string.Format("Couldn't find matching nodes for : \"{0}\" in {1}", xPath,
|
||||
xml.InnerXml));
|
||||
}
|
||||
var decodedValue = WebUtility.HtmlDecode(titleNodes[0].InnerText);
|
||||
return decodedValue.Trim();
|
||||
}
|
||||
|
||||
protected static List<string> XpathMatchStringList(XmlDocument xml, string xPath)
|
||||
{
|
||||
var titleNodes = xml.SelectNodes(xPath);
|
||||
if (titleNodes == null || titleNodes.Count == 0)
|
||||
throw new ApplicationException("Couldn't find matching nodes for : " + xPath);
|
||||
|
||||
return (
|
||||
from XmlNode node in titleNodes
|
||||
select WebUtility.HtmlDecode(node.InnerText)
|
||||
into decodedValue
|
||||
select decodedValue.Trim()
|
||||
).ToList();
|
||||
}
|
||||
|
||||
protected static IEnumerable<XmlDocument> XpathMatchXmlList(XmlDocument xml, string xPath)
|
||||
{
|
||||
var titleNodes = xml.SelectNodes(xPath);
|
||||
if (titleNodes == null || titleNodes.Count == 0)
|
||||
{
|
||||
xml.Save("problem.xml");
|
||||
throw new ApplicationException("Couldn't find matching nodes for : " + xPath);
|
||||
}
|
||||
|
||||
var xmlList = new List<XmlDocument>();
|
||||
foreach (XmlNode node in titleNodes)
|
||||
{
|
||||
var xmlDocument = new XmlDocument();
|
||||
xmlDocument.LoadXml(xml.FirstChild.InnerXml + "<root></root>");
|
||||
|
||||
var importNode = xmlDocument.ImportNode(node, true);
|
||||
if (xmlDocument.DocumentElement == null)
|
||||
throw new ApplicationException("xmlDocument.DocumentElement Null");
|
||||
xmlDocument.DocumentElement.AppendChild(importNode);
|
||||
|
||||
xmlList.Add(xmlDocument);
|
||||
}
|
||||
return xmlList;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class SongAppearsOnAlbumParser : ParserBase<SongAppearsOnAlbum>
|
||||
{
|
||||
public override SongAppearsOnAlbum Parse(XmlDocument xml)
|
||||
{
|
||||
var albumResult = new SongAppearsOnAlbum();
|
||||
var settings = SongAppearsOnAlbumScraper.Default;
|
||||
|
||||
var albumUrl = XpathMatchString(xml, settings.AlbumUrlXpath);
|
||||
albumResult.AlbumId = RegexCapture(albumUrl, settings.AlbumUrlIdRegex);
|
||||
|
||||
if (XpathMatch(xml, settings.YearXpath))
|
||||
{
|
||||
var yearRaw = XpathMatchString(xml, settings.YearXpath);
|
||||
if (RegexMatch(yearRaw, settings.YearRegex))
|
||||
{
|
||||
var year = RegexCapture(yearRaw, settings.YearRegex);
|
||||
int yearInt;
|
||||
if (Int32.TryParse(year, out yearInt))
|
||||
albumResult.Year = yearInt;
|
||||
}
|
||||
}
|
||||
|
||||
if (XpathMatch(xml, settings.ArtistUrlXpath))
|
||||
{
|
||||
var artistId = XpathMatchString(xml, settings.ArtistUrlXpath);
|
||||
albumResult.ArtistId = RegexCapture(artistId, settings.ArtistUrIdRegex);
|
||||
albumResult.ArtistName = XpathMatchString(xml, settings.ArtistXpath);
|
||||
}
|
||||
else if (XpathMatch(xml, settings.ArtistNoUrlXpath))
|
||||
{
|
||||
albumResult.ArtistName = XpathMatchString(xml, settings.ArtistNoUrlXpath);
|
||||
}
|
||||
|
||||
albumResult.AlbumTitle = XpathMatchString(xml, settings.TitleXpath);
|
||||
|
||||
return albumResult;
|
||||
}
|
||||
}
|
||||
|
||||
public class SongParser : ParserBase<Song>
|
||||
{
|
||||
public override Song Parse(XmlDocument xml)
|
||||
{
|
||||
var song = new Song();
|
||||
var settings = SongScraper.Default;
|
||||
|
||||
song.SongTitle = XpathMatchString(xml, settings.SongTitleXpath);
|
||||
var songUrlId = XpathMatchString(xml, settings.SongUrlIdXpath);
|
||||
song.SongId = RegexCapture(songUrlId, settings.SongUrlIdRegex);
|
||||
|
||||
song.AppearsOnAlbum = new List<SongAppearsOnAlbum>();
|
||||
var songAppearsOnAlbumParser = new SongAppearsOnAlbumParser();
|
||||
|
||||
if (XpathMatch(xml, settings.AlbumXpath))
|
||||
{
|
||||
var albumResultInfoXmlList = XpathMatchXmlList(xml, settings.AlbumXpath);
|
||||
song.AppearsOnAlbum.AddRange(albumResultInfoXmlList.Select(songAppearsOnAlbumParser.Parse));
|
||||
var i = 1;
|
||||
song.AppearsOnAlbum.ForEach(ar => ar.ResultOrder = i++);
|
||||
}
|
||||
|
||||
return song;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class SongResultPageParser : ParserBase<List<SongResult>>
|
||||
{
|
||||
public override List<SongResult> Parse(XmlDocument xml)
|
||||
{
|
||||
var songResults = new List<SongResult>();
|
||||
var settings = SongResultPageScraper.Default;
|
||||
var songResultScraper = new SongResultParser();
|
||||
|
||||
if (XpathMatch(xml, settings.SongXpath))
|
||||
{
|
||||
var songResultInfoXmlList = XpathMatchXmlList(xml, settings.SongXpath);
|
||||
songResults.AddRange(songResultInfoXmlList.Select(songResultScraper.Parse));
|
||||
var i = 1;
|
||||
songResults.ForEach(ar => ar.ResultOrder = i++);
|
||||
}
|
||||
return songResults;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using System.Xml;
|
||||
using MusicMetaTagger.Client.AllMusicGuide.Properties;
|
||||
using MusicMetaTagger.Core.Model;
|
||||
|
||||
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser
|
||||
{
|
||||
public class SongResultParser : ParserBase<SongResult>
|
||||
{
|
||||
public override SongResult Parse(XmlDocument xml)
|
||||
{
|
||||
var songResult = new SongResult();
|
||||
var settings = SongResultScraper.Default;
|
||||
|
||||
songResult.SongTitle = XpathMatchString(xml, settings.SongTitleXpath);
|
||||
if (RegexMatch(songResult.SongTitle, settings.SongTitleRegex))
|
||||
songResult.SongTitle = RegexCapture(songResult.SongTitle, settings.SongTitleRegex);
|
||||
|
||||
var songUrl = XpathMatchString(xml, settings.SongUrlIdXpath);
|
||||
songResult.SongId = RegexCapture(songUrl, settings.SongUrlIdRegex);
|
||||
|
||||
if (XpathMatch(xml, settings.ArtistUrlXpath))
|
||||
{
|
||||
var artistId = XpathMatchString(xml, settings.ArtistUrlXpath);
|
||||
songResult.ArtistId = RegexCapture(artistId, settings.ArtistUrIdRegex);
|
||||
songResult.ArtistName = XpathMatchString(xml, settings.ArtistXpath);
|
||||
}
|
||||
|
||||
return songResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user