protected static async Task NotifyPlayback(MediaItem mediaItem, int playPercentage, double playDuration) { ISettingsManager settingsManager = ServiceRegistration.Get <ISettingsManager>(); PlayerManagerSettings settings = settingsManager.Load <PlayerManagerSettings>(); bool watched = playPercentage >= settings.WatchedPlayPercentage; if (watched && mediaItem.IsLastPart) { playPercentage = 100; } else if (watched && !mediaItem.IsLastPart) { playPercentage = 50; } IServerConnectionManager scm = ServiceRegistration.Get <IServerConnectionManager>(); IContentDirectory cd = scm.ContentDirectory; if (cd != null) { IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>(); if (userProfileDataManagement.IsValidUser) { bool updatePlayDate = (watched || playDuration >= MINIMUM_WATCHED_SEC || playPercentage >= MINIMUM_WATCHED_PERCENT); await cd.NotifyUserPlaybackAsync(userProfileDataManagement.CurrentUser.ProfileId, mediaItem.MediaItemId, playPercentage, updatePlayDate); } else { await cd.NotifyPlaybackAsync(mediaItem.MediaItemId, watched); } } // Update loaded item also, so changes will be visible in GUI without reloading if (!mediaItem.UserData.ContainsKey(UserDataKeysKnown.KEY_PLAY_PERCENTAGE)) { mediaItem.UserData.Add(UserDataKeysKnown.KEY_PLAY_PERCENTAGE, "0"); } mediaItem.UserData[UserDataKeysKnown.KEY_PLAY_PERCENTAGE] = UserDataKeysKnown.GetSortablePlayPercentageString(playPercentage); if (watched) { // Update loaded item also, so changes will be visible in GUI without reloading int currentPlayCount; if (MediaItemAspect.TryGetAttribute(mediaItem.Aspects, MediaAspect.ATTR_PLAYCOUNT, 0, out currentPlayCount)) { MediaItemAspect.SetAttribute(mediaItem.Aspects, MediaAspect.ATTR_PLAYCOUNT, ++currentPlayCount); } if (!mediaItem.UserData.ContainsKey(UserDataKeysKnown.KEY_PLAY_COUNT)) { mediaItem.UserData.Add(UserDataKeysKnown.KEY_PLAY_COUNT, UserDataKeysKnown.GetSortablePlayCountString(0)); } currentPlayCount = Convert.ToInt32(mediaItem.UserData[UserDataKeysKnown.KEY_PLAY_COUNT]); currentPlayCount++; mediaItem.UserData[UserDataKeysKnown.KEY_PLAY_COUNT] = UserDataKeysKnown.GetSortablePlayCountString(currentPlayCount); } ContentDirectoryMessaging.SendMediaItemChangedMessage(mediaItem, ContentDirectoryMessaging.MediaItemChangeType.Updated); }
public override async Task <AsyncResult <ContentDirectoryMessaging.MediaItemChangeType> > ProcessAsync(MediaItem mediaItem) { var falseResult = new AsyncResult <ContentDirectoryMessaging.MediaItemChangeType>(false, ContentDirectoryMessaging.MediaItemChangeType.None); IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory; if (cd == null) { return(falseResult); } IList <MultipleMediaItemAspect> pras; if (!MediaItemAspect.TryGetAspects(mediaItem.Aspects, ProviderResourceAspect.Metadata, out pras)) { return(falseResult); } Guid? userProfile = null; IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>(); if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser) { userProfile = userProfileDataManagement.CurrentUser.ProfileId; } bool watched = GetNewWatchedState(); int playPercentage = watched ? 100 : 0; if (userProfile.HasValue) { await cd.NotifyUserPlaybackAsync(userProfile.Value, mediaItem.MediaItemId, playPercentage, watched); } else { await cd.NotifyPlaybackAsync(mediaItem.MediaItemId, watched); } //Also update media item locally so changes are reflected in GUI without reloading mediaItem.UserData[UserDataKeysKnown.KEY_PLAY_PERCENTAGE] = UserDataKeysKnown.GetSortablePlayPercentageString(playPercentage); return(new AsyncResult <ContentDirectoryMessaging.MediaItemChangeType>(true, ContentDirectoryMessaging.MediaItemChangeType.Updated)); }
protected override async Task <MediaItemQuery> CreateQueryAsync() { Guid? userProfile = CurrentUserProfile?.ProfileId; IFilter filter; if (userProfile.HasValue) { filter = await AppendUserFilterAsync( new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.EQ, UserDataKeysKnown.GetSortablePlayPercentageString(0), true), _necessaryMias); } else { filter = new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.EQ, 0); } IFilter navigationFilter = GetNavigationFilter(_navigationInitializerType); if (navigationFilter != null) { filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, navigationFilter); } return(new MediaItemQuery(_necessaryMias, _optionalMias, filter) { SortInformation = new List <ISortInformation> { new AttributeSortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Ascending) } }); }
protected override async Task <MediaItemQuery> CreateQueryAsync() { Guid? userProfile = CurrentUserProfile?.ProfileId; IFilter linkedFilter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.Or, new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE), new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.EQ, UserDataKeysKnown.GetSortablePlayPercentageString(0))) : null; IFilter filter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new FilteredRelationshipFilter(_role, _linkedRole, await AppendUserFilterAsync(null, _necessaryLinkedMias)), new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.EQ, UserDataKeysKnown.GetSortablePlayPercentageString(0), true)) : new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.EQ, 0); return(new MediaItemQuery(_necessaryMias, _optionalMias, filter) { SubqueryFilter = GetNavigationFilter(_navigationInitializerType), SortInformation = new List <ISortInformation> { new AttributeSortInformation(ImporterAspect.ATTR_DATEADDED, SortDirection.Ascending) } }); }
public override async Task <ICollection <FilterValue> > GetAvailableValuesAsync(IEnumerable <Guid> necessaryMIATypeIds, IFilter selectAttributeFilter, IFilter filter) { IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory; if (cd == null) { throw new NotConnectedException("The MediaLibrary is not connected"); } IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>(); if (!userProfileDataManagement.IsValidUser) { return(new List <FilterValue>()); } IFilter unwatchedFilter = new RelationalUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.EQ, UserDataKeysKnown.GetSortablePlayPercentageString(0), true); IFilter watchedFilter = new RelationalUserDataFilter(userProfileDataManagement.CurrentUser.ProfileId, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayPercentageString(0)); bool showVirtual = VirtualMediaHelper.ShowVirtualMedia(necessaryMIATypeIds); var taskUnwatched = cd.CountMediaItemsAsync(necessaryMIATypeIds, BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, unwatchedFilter), true, showVirtual); var taskWatched = cd.CountMediaItemsAsync(necessaryMIATypeIds, BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, watchedFilter), true, showVirtual); var counts = await Task.WhenAll(taskUnwatched, taskWatched); return(new List <FilterValue>(new FilterValue[] { new FilterValue(Consts.RES_VALUE_UNWATCHED, unwatchedFilter, null, counts[0], this), new FilterValue(Consts.RES_VALUE_WATCHED, watchedFilter, null, counts[1], this), }.Where(fv => !fv.NumItems.HasValue || fv.NumItems.Value > 0))); }
internal static WebTVSeasonBasic TVSeasonBasic(IOwinContext context, MediaItem item, Guid?showId = null) { Guid? user = ResourceAccessUtils.GetUser(context); ISet <Guid> necessaryMIATypespisodes = new HashSet <Guid>(); necessaryMIATypespisodes.Add(MediaAspect.ASPECT_ID); necessaryMIATypespisodes.Add(EpisodeAspect.ASPECT_ID); IFilter unwatchedEpisodeFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new RelationshipFilter(EpisodeAspect.ROLE_EPISODE, SeasonAspect.ROLE_SEASON, item.MediaItemId), new RelationalUserDataFilter(user.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100), true)); int unwatchedCount = MediaLibraryAccess.CountMediaItems(context, necessaryMIATypespisodes, unwatchedEpisodeFilter); GetShowId(item, ref showId); var mediaAspect = item.GetAspect(MediaAspect.Metadata); var seasonAspect = item.GetAspect(SeasonAspect.Metadata); var importerAspect = item.GetAspect(ImporterAspect.Metadata); DateTime?firstAired = mediaAspect.GetAttributeValue <DateTime?>(MediaAspect.ATTR_RECORDINGTIME); return(new WebTVSeasonBasic { Title = mediaAspect.GetAttributeValue <string>(MediaAspect.ATTR_TITLE), Id = item.MediaItemId.ToString(), ShowId = showId.HasValue ? showId.Value.ToString() : null, SeasonNumber = seasonAspect.GetAttributeValue <int>(SeasonAspect.ATTR_SEASON), EpisodeCount = seasonAspect.GetAttributeValue <int>(SeasonAspect.ATTR_AVAILABLE_EPISODES), UnwatchedEpisodeCount = unwatchedCount, DateAdded = importerAspect.GetAttributeValue <DateTime>(ImporterAspect.ATTR_DATEADDED), Year = firstAired.HasValue ? firstAired.Value.Year : 0, }); }
protected override async Task <MediaItemQuery> CreateQueryAsync() { Guid? userProfile = CurrentUserProfile?.ProfileId; IFilter filter = userProfile.HasValue ? await AppendUserFilterAsync(BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_DATE)), new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100)), new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayPercentageString(0))), _necessaryMias) : new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.EQ, 0); IFilter navigationFilter = GetNavigationFilter(_navigationInitializerType); if (navigationFilter != null) { filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, navigationFilter); } ISortInformation sort = userProfile.HasValue ? (ISortInformation) new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending) : (ISortInformation) new AttributeSortInformation(MediaAspect.ATTR_LASTPLAYED, SortDirection.Descending); return(new MediaItemQuery(_necessaryMias, _optionalMias, filter) { SortInformation = new List <ISortInformation> { sort } }); }
protected override async Task <MediaItemQuery> CreateQueryAsync() { Guid?userProfile = CurrentUserProfile?.ProfileId; return(new MediaItemQuery(_necessaryMias, _optionalMias, null) { Filter = userProfile.HasValue ? new FilteredRelationshipFilter(_role, _linkedRole, await AppendUserFilterAsync( BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_DATE)), new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100)), new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayPercentageString(0))), _necessaryLinkedMias)) : null, SubqueryFilter = GetNavigationFilter(_navigationInitializerType), SortInformation = new List <ISortInformation> { new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending) } }); }
internal static WebTVShowBasic TVShowBasic(IOwinContext context, MediaItem item) { ISet <Guid> necessaryMIATypespisodes = new HashSet <Guid>(); necessaryMIATypespisodes.Add(MediaAspect.ASPECT_ID); necessaryMIATypespisodes.Add(EpisodeAspect.ASPECT_ID); IFilter unwatchedEpisodeFilter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new RelationshipFilter(EpisodeAspect.ROLE_EPISODE, SeriesAspect.ROLE_SERIES, item.MediaItemId), new RelationalUserDataFilter(Guid.Empty, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100), true)); int unwatchedCount = MediaLibraryAccess.CountMediaItems(context, necessaryMIATypespisodes, unwatchedEpisodeFilter); var mediaAspect = item.GetAspect(MediaAspect.Metadata); var seriesAspect = item.GetAspect(SeriesAspect.Metadata); var importerAspect = item.GetAspect(ImporterAspect.Metadata); DateTime? firstAired = mediaAspect.GetAttributeValue <DateTime?>(MediaAspect.ATTR_RECORDINGTIME); IList <WebActor> actors = seriesAspect.GetCollectionAttribute <string>(SeriesAspect.ATTR_ACTORS)?.Distinct().Select(a => new WebActor(a)).ToList() ?? new List <WebActor>(); WebArtwork aw = new WebArtwork(); var show = new WebTVShowBasic() { Id = item.MediaItemId.ToString(), Title = seriesAspect.GetAttributeValue <string>(SeriesAspect.ATTR_SERIES_NAME), DateAdded = importerAspect.GetAttributeValue <DateTime>(ImporterAspect.ATTR_DATEADDED), EpisodeCount = seriesAspect.GetAttributeValue <int>(SeriesAspect.ATTR_AVAILABLE_EPISODES), SeasonCount = seriesAspect.GetAttributeValue <int>(SeriesAspect.ATTR_AVAILABLE_SEASONS), Rating = Convert.ToSingle(seriesAspect.GetAttributeValue <double>(SeriesAspect.ATTR_TOTAL_RATING)), ContentRating = seriesAspect.GetAttributeValue <string>(SeriesAspect.ATTR_CERTIFICATION), Actors = actors, UnwatchedEpisodeCount = unwatchedCount, Year = firstAired.HasValue ? firstAired.Value.Year : 0, }; IList <MediaItemAspect> genres; if (item.Aspects.TryGetValue(GenreAspect.ASPECT_ID, out genres)) { show.Genres = genres.Select(g => g.GetAttributeValue <string>(GenreAspect.ATTR_GENRE)).ToList(); } string tvDbId; MediaItemAspect.TryGetExternalAttribute(item.Aspects, ExternalIdentifierAspect.SOURCE_TVDB, ExternalIdentifierAspect.TYPE_SERIES, out tvDbId); if (tvDbId != null) { show.ExternalId.Add(new WebExternalId { Site = "TVDB", Id = tvDbId }); } string imdbId; MediaItemAspect.TryGetExternalAttribute(item.Aspects, ExternalIdentifierAspect.SOURCE_IMDB, ExternalIdentifierAspect.TYPE_SERIES, out imdbId); if (imdbId != null) { show.ExternalId.Add(new WebExternalId { Site = "IMDB", Id = imdbId }); } return(show); }