mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
163 lines
6.1 KiB
C#
163 lines
6.1 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: ZuneUI.QuickMixPlaylistFactory
|
|
// Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264
|
|
// Assembly location: C:\Program Files\Zune\ZuneShell.dll
|
|
|
|
using Microsoft.Iris;
|
|
using Microsoft.Zune.Configuration;
|
|
using Microsoft.Zune.PerfTrace;
|
|
using Microsoft.Zune.Playlist;
|
|
using Microsoft.Zune.QuickMix;
|
|
using Microsoft.Zune.Util;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
namespace ZuneUI
|
|
{
|
|
public class QuickMixPlaylistFactory : PlaylistFactory
|
|
{
|
|
private const int _minimumSimilarArtistsRequired = 10;
|
|
private QuickMixSession _quickMixSession;
|
|
private bool _shouldDisposeSession;
|
|
private HRESULT _hrCreation = HRESULT._E_PENDING;
|
|
private EQuickMixMode _mode;
|
|
private List<string> _similarArtistStrings;
|
|
|
|
private QuickMixPlaylistFactory(
|
|
int mediaId,
|
|
MediaType mediaType,
|
|
EQuickMixMode mode,
|
|
out HRESULT hr)
|
|
: base(true)
|
|
{
|
|
TimeSpan maxBatchTimeout = TimeSpan.FromMilliseconds(5000.0);
|
|
int[] seedMediaIds = new int[1] { mediaId };
|
|
this._mode = mode;
|
|
QuickMix instance = QuickMix.Instance;
|
|
hr = instance.CreateSession(this._mode, seedMediaIds, (EMediaTypes)mediaType, out this._quickMixSession);
|
|
if (!hr.IsSuccess)
|
|
return;
|
|
this._shouldDisposeSession = true;
|
|
if (this._mode != EQuickMixMode.eQuickMixModeSimilarArtists)
|
|
PerfTrace.TraceUICollectionEvent(UICollectionEvent.QuickMixBegin, "");
|
|
hr = this._quickMixSession.GetSimilarMedia((uint)ClientConfiguration.QuickMix.DefaultPlaylistLength, maxBatchTimeout, new SimilarMediaBatchHandler(this.SimilarBatchHandler), new BatchEndHandler(this.BatchEndHandler));
|
|
}
|
|
|
|
private QuickMixPlaylistFactory(
|
|
Guid serviceMediaId,
|
|
MediaType mediaType,
|
|
EQuickMixMode mode,
|
|
out HRESULT hr)
|
|
: base(true)
|
|
{
|
|
TimeSpan maxBatchTimeout = TimeSpan.FromMilliseconds(10000.0);
|
|
this._mode = mode;
|
|
QuickMix instance = QuickMix.Instance;
|
|
hr = instance.CreateSession(this._mode, serviceMediaId, (EMediaTypes)mediaType, null, out this._quickMixSession);
|
|
if (!hr.IsSuccess)
|
|
return;
|
|
this._shouldDisposeSession = true;
|
|
hr = this._quickMixSession.GetSimilarMedia((uint)ClientConfiguration.QuickMix.DefaultPlaylistLength, maxBatchTimeout, new SimilarMediaBatchHandler(this.SimilarBatchHandler), new BatchEndHandler(this.BatchEndHandler));
|
|
}
|
|
|
|
private QuickMixPlaylistFactory(QuickMixSession quickMixSession)
|
|
: base(true)
|
|
{
|
|
this._quickMixSession = quickMixSession;
|
|
this._shouldDisposeSession = false;
|
|
this._hrCreation = HRESULT._S_OK;
|
|
this.Ready = true;
|
|
}
|
|
|
|
public override void Dispose()
|
|
{
|
|
if (!this._shouldDisposeSession || this._quickMixSession == null)
|
|
return;
|
|
this._quickMixSession.Dispose();
|
|
this._quickMixSession = null;
|
|
}
|
|
|
|
public static QuickMixPlaylistFactory CreateInstance(
|
|
int mediaId,
|
|
MediaType mediaType)
|
|
{
|
|
return CreateInstance(mediaId, EQuickMixMode.eQuickMixModePlaylist, mediaType);
|
|
}
|
|
|
|
public static QuickMixPlaylistFactory CreateInstance(
|
|
int mediaId,
|
|
EQuickMixMode mode,
|
|
MediaType mediaType)
|
|
{
|
|
HRESULT hr;
|
|
QuickMixPlaylistFactory mixPlaylistFactory = new QuickMixPlaylistFactory(mediaId, mediaType, mode, out hr);
|
|
return hr.IsSuccess ? mixPlaylistFactory : null;
|
|
}
|
|
|
|
public static QuickMixPlaylistFactory CreateInstance(
|
|
Guid serviceMediaId,
|
|
EQuickMixMode mode,
|
|
MediaType mediaType)
|
|
{
|
|
HRESULT hr;
|
|
QuickMixPlaylistFactory mixPlaylistFactory = new QuickMixPlaylistFactory(serviceMediaId, mediaType, mode, out hr);
|
|
return hr.IsSuccess ? mixPlaylistFactory : null;
|
|
}
|
|
|
|
public static QuickMixPlaylistFactory CreateInstance(
|
|
QuickMixSession quickMixSession)
|
|
{
|
|
return new QuickMixPlaylistFactory(quickMixSession);
|
|
}
|
|
|
|
public override string GetUniqueTitle()
|
|
{
|
|
string playlistTitle = "";
|
|
this._quickMixSession.GetPlaylistTitle(out playlistTitle);
|
|
return playlistTitle;
|
|
}
|
|
|
|
public override PlaylistResult CreatePlaylist(
|
|
string title,
|
|
CreatePlaylistOption option)
|
|
{
|
|
SQMLog.Log(SQMDataId.QuickMixPlaylistCreates, 1);
|
|
int playlistId = -1;
|
|
HRESULT hr = HRESULT._E_PENDING;
|
|
if (this.Ready)
|
|
{
|
|
hr = this._hrCreation;
|
|
if (hr.IsSuccess)
|
|
hr = this._quickMixSession.SaveAsPlaylist(title, option, out playlistId);
|
|
}
|
|
return new PlaylistResult(playlistId, hr);
|
|
}
|
|
|
|
private void BatchEndHandler(HRESULT hrAsync) => Application.DeferredInvoke(delegate
|
|
{
|
|
this._hrCreation = hrAsync;
|
|
this.Ready = true;
|
|
if (this._mode == EQuickMixMode.eQuickMixModeSimilarArtists)
|
|
return;
|
|
PerfTrace.TraceUICollectionEvent(UICollectionEvent.QuickMixComplete, "");
|
|
}, null);
|
|
|
|
private void SimilarBatchHandler(IList itemList) => Application.DeferredInvoke(delegate
|
|
{
|
|
if (this._mode != EQuickMixMode.eQuickMixModeSimilarArtists)
|
|
return;
|
|
if (this._similarArtistStrings == null)
|
|
this._similarArtistStrings = new List<string>();
|
|
foreach (QuickMixItem quickMixItem in itemList)
|
|
this._similarArtistStrings.Add(quickMixItem.ArtistName);
|
|
if (this._similarArtistStrings.Count <= 10)
|
|
return;
|
|
this.Ready = true;
|
|
}, null);
|
|
|
|
public IList SimilarArtists => _similarArtistStrings;
|
|
}
|
|
}
|