[WIP] sync

This commit is contained in:
Yoshi Askharoun
2023-10-08 20:49:37 -05:00
parent a718ad1f48
commit dbf74db8ef
11 changed files with 274 additions and 165 deletions
+120 -112
View File
@@ -470,118 +470,7 @@ namespace Microsoft.Zune.Library
}
var stTracks = m_dataRoot.Library.GetTracksAsync(int.MaxValue, 0);
await foreach (var stTrack in stTracks)
{
var stAlbum = stTrack.Album;
var stAlbumArtist = stAlbum != null
? await stAlbum.GetArtistItemsAsync(1, 0).FirstOrDefaultAsync()
: null;
// Handle filters
if (queryType == EQueryType.eQueryTypeTracksForAlbumId)
{
var currentAlbumId = stAlbum?.Id.HashToInt32();
if (currentAlbumId != albumId) continue;
}
else if (queryType == EQueryType.eQueryTypeTracksForAlbumArtistId)
{
var currentAlbumArtistId = stAlbumArtist?.Id.HashToInt32();
if (currentAlbumArtistId != albumArtistId) continue;
}
else if (queryType == EQueryType.eQueryTypeTracksByGenreId)
{
var containsCurrentGenre = await stTrack.GetGenresAsync(int.MaxValue, 0)
.Select(g => g.Name.HashToInt32())
.AnyAsync(g => g == genreId);
if (!containsCurrentGenre && stAlbum != null)
{
// If the track doesn't have the genre, the album might.
containsCurrentGenre = await stAlbum.GetGenresAsync(int.MaxValue, 0)
.Select(g => g.Name.HashToInt32())
.AnyAsync(g => g == genreId);
}
if (!containsCurrentGenre) continue;
}
Schemas.Track track = new(m_dataType)
{
AlbumName = stTrack.Album?.Name,
AlbumLibraryId = stTrack.Album?.Id.HashToInt32() ?? 0,
TitleYomi = stTrack.Name,
ReleaseDate = DateTime.Now,
ZuneMediaId = stTrack.Id.HashToGuid(),
TrackNumber = stTrack.TrackNumber ?? 0,
Duration = stTrack.Duration,
ComponentId = "strix",
FileName = System.IO.Path.GetFileName(stTrack.Id),
FolderName = System.IO.Path.GetDirectoryName(stTrack.Id),
FilePath = stTrack.Id,
NowPlaying = false,
InLibrary = true,
DateLastPlayed = stTrack.LastPlayed ?? DateTime.MinValue,
PlayCount = 0,
FileSize = 0,
ComposerName = null,
ConductorName = null,
IsProtected = 0,
DateAdded = stTrack.AddedAt ?? DateTime.Now,
Bitrate = 0,
MediaType = "track",
DiscNumber = stTrack.DiscNumber ?? 0,
DateAlbumAdded = DateTime.Now,
FileCount = 1L,
DrmState = 0,
DrmStateMask = 0L,
QuickMixState = 0,
LibraryId = stTrack.Id.HashToInt32(),
Title = stTrack.Name,
SyncState = 0,
Type = "track",
DeviceFileSize = 0L,
UserRating = 0,
AlbumArtistName = stAlbumArtist?.Name,
AlbumArtistLibraryId = stAlbumArtist?.Id.HashToInt32() ?? 0
};
var stArtists = stTrack.GetArtistItemsAsync(int.MaxValue, 0);
bool setPrimaryArtist = false;
List<string> contributingArtists = new();
await foreach (var stArtist in stArtists)
{
if (!setPrimaryArtist)
{
track.ArtistLibraryId = stArtist.Id.HashToInt32();
track.ArtistName = stArtist.Name;
track.ArtistNameYomi = stArtist.Name;
setPrimaryArtist = true;
}
else if (!string.IsNullOrEmpty(stArtist.Name))
{
contributingArtists.Add(stArtist.Name);
}
}
track.ContributingArtistCount = contributingArtists.Count;
track.ContributingArtistNames = contributingArtists;
// No artists
if (!setPrimaryArtist)
{
track.ArtistLibraryId = 0;
track.ArtistName = null;
track.ArtistNameYomi = null;
}
var stGenre = await stTrack.GetGenresAsync(1, 0).FirstOrDefaultAsync();
track.Genre = stGenre?.Name;
queryList.Add(track.Item);
}
}
else if (text == "AlbumByTOC")
{
@@ -659,6 +548,8 @@ namespace Microsoft.Zune.Library
if (!TryGetProperty("PinType", out EPinType pinType))
pinType = EPinType.ePinTypeGeneric;
var pinnedTracks = m_dataRoot.Library.GetTracksAsync(3, 0);
Schemas.Pin pin = new(m_dataType)
{
PinId = 42,
@@ -715,6 +606,123 @@ namespace Microsoft.Zune.Library
Result = libraryDataProviderQueryResult;
Status = DataProviderQueryStatus.Complete;
}
private Schemas.Track CreateTrack(ZuneQueryList queryList, )
{
await foreach (var stTrack in stTracks)
{
var stAlbum = stTrack.Album;
var stAlbumArtist = stAlbum != null
? await stAlbum.GetArtistItemsAsync(1, 0).FirstOrDefaultAsync()
: null;
// Handle filters
if (queryType == EQueryType.eQueryTypeTracksForAlbumId)
{
var currentAlbumId = stAlbum?.Id.HashToInt32();
if (currentAlbumId != albumId) continue;
}
else if (queryType == EQueryType.eQueryTypeTracksForAlbumArtistId)
{
var currentAlbumArtistId = stAlbumArtist?.Id.HashToInt32();
if (currentAlbumArtistId != albumArtistId) continue;
}
else if (queryType == EQueryType.eQueryTypeTracksByGenreId)
{
var containsCurrentGenre = await stTrack.GetGenresAsync(int.MaxValue, 0)
.Select(g => g.Name.HashToInt32())
.AnyAsync(g => g == genreId);
if (!containsCurrentGenre && stAlbum != null)
{
// If the track doesn't have the genre, the album might.
containsCurrentGenre = await stAlbum.GetGenresAsync(int.MaxValue, 0)
.Select(g => g.Name.HashToInt32())
.AnyAsync(g => g == genreId);
}
if (!containsCurrentGenre) continue;
}
Schemas.Track track = new(m_dataType)
{
AlbumName = stTrack.Album?.Name,
AlbumLibraryId = stTrack.Album?.Id.HashToInt32() ?? 0,
TitleYomi = stTrack.Name,
ReleaseDate = DateTime.Now,
ZuneMediaId = stTrack.Id.HashToGuid(),
TrackNumber = stTrack.TrackNumber ?? 0,
Duration = stTrack.Duration,
ComponentId = "strix",
FileName = System.IO.Path.GetFileName(stTrack.Id),
FolderName = System.IO.Path.GetDirectoryName(stTrack.Id),
FilePath = stTrack.Id,
NowPlaying = false,
InLibrary = true,
DateLastPlayed = stTrack.LastPlayed ?? DateTime.MinValue,
PlayCount = 0,
FileSize = 0,
ComposerName = null,
ConductorName = null,
IsProtected = 0,
DateAdded = stTrack.AddedAt ?? DateTime.Now,
Bitrate = 0,
MediaType = "track",
DiscNumber = stTrack.DiscNumber ?? 0,
DateAlbumAdded = DateTime.Now,
FileCount = 1L,
DrmState = 0,
DrmStateMask = 0L,
QuickMixState = 0,
LibraryId = stTrack.Id.HashToInt32(),
Title = stTrack.Name,
SyncState = 0,
Type = "track",
DeviceFileSize = 0L,
UserRating = 0,
AlbumArtistName = stAlbumArtist?.Name,
AlbumArtistLibraryId = stAlbumArtist?.Id.HashToInt32() ?? 0
};
var stArtists = stTrack.GetArtistItemsAsync(int.MaxValue, 0);
bool setPrimaryArtist = false;
List<string> contributingArtists = new();
await foreach (var stArtist in stArtists)
{
if (!setPrimaryArtist)
{
track.ArtistLibraryId = stArtist.Id.HashToInt32();
track.ArtistName = stArtist.Name;
track.ArtistNameYomi = stArtist.Name;
setPrimaryArtist = true;
}
else if (!string.IsNullOrEmpty(stArtist.Name))
{
contributingArtists.Add(stArtist.Name);
}
}
track.ContributingArtistCount = contributingArtists.Count;
track.ContributingArtistNames = contributingArtists;
// No artists
if (!setPrimaryArtist)
{
track.ArtistLibraryId = 0;
track.ArtistName = null;
track.ArtistNameYomi = null;
}
var stGenre = await stTrack.GetGenresAsync(1, 0).FirstOrDefaultAsync();
track.Genre = stGenre?.Name;
track.Item.Storage["StrixItem"] = stTrack;
queryList.Add(track.Item);
}
}
}
internal class DeferredSetResultArgs