Exemple #1
0
        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 linkedFilter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                                  new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_COUNT)),
                                                                                                  new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_COUNT, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayCountString(0))) :
                                   null;
            IFilter filter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                            new FilteredRelationshipFilter(_role, _linkedRole, await AppendUserFilterAsync(linkedFilter, _necessaryLinkedMias)),
                                                                                            new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_MAX_CHILD_COUNT))) :
                             new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.GT, 0);

            List <ISortInformation> sort = userProfile.HasValue ? new List <ISortInformation>
            {
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_MAX_CHILD_COUNT, SortDirection.Descending),
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_COUNT, SortDirection.Descending),
                new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending)
            } :
            new List <ISortInformation>
            {
                new AttributeSortInformation(MediaAspect.ATTR_PLAYCOUNT, SortDirection.Descending),
                new AttributeSortInformation(MediaAspect.ATTR_LASTPLAYED, SortDirection.Descending)
            };

            return(new MediaItemQuery(_necessaryMias, _optionalMias, filter)
            {
                SubqueryFilter = GetNavigationFilter(_navigationInitializerType),
                SortInformation = sort
            });
        }
Exemple #4
0
        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)
                }
            });
        }
Exemple #6
0
        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)));
        }
Exemple #7
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,
            });
        }
Exemple #8
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)
                }
            });
        }
        private async Task UpdateWatchDuration(IChannel channel)
        {
            if (channel != null && _watchStart.ContainsKey(channel) && (DateTime.UtcNow - _watchStart[channel]).TotalSeconds > PROGRAM_WATCHED_SEC)
            {
                Guid?           userProfile = null;
                IUserManagement userProfileDataManagement = ServiceRegistration.Get <IUserManagement>();
                if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
                {
                    userProfile = userProfileDataManagement.CurrentUser.ProfileId;
                }

                if (userProfile.HasValue)
                {
                    var userResult = await userProfileDataManagement.UserProfileDataManagement.GetUserAdditionalDataAsync(userProfile.Value, UserDataKeysKnown.KEY_CHANNEL_PLAY_COUNT, channel.ChannelId);

                    string data  = userResult.Result;
                    double count = (data != null ? Convert.ToDouble(data, CultureInfo.InvariantCulture) : 0) + (DateTime.UtcNow - _watchStart[channel]).TotalHours;
                    await userProfileDataManagement.UserProfileDataManagement.SetUserAdditionalDataAsync(userProfile.Value,
                                                                                                         UserDataKeysKnown.KEY_CHANNEL_PLAY_COUNT, UserDataKeysKnown.GetSortableChannelPlayCountString(count), channel.ChannelId);

                    await userProfileDataManagement.UserProfileDataManagement.SetUserAdditionalDataAsync(userProfile.Value,
                                                                                                         UserDataKeysKnown.KEY_CHANNEL_PLAY_DATE, UserDataKeysKnown.GetSortablePlayDateString(DateTime.Now), channel.ChannelId);
                }
            }
        }
        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);
        }