void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
            {
                return;
            }

            lock (_syncLock)
            {
                if (UpdateTimer == null)
                {
                    UpdateTimer = new Timer(UpdateTimerCallback, null, UpdateDuration,
                                            Timeout.Infinite);
                }
                else
                {
                    UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
                }

                List <string> keys;

                if (!_changedKeys.TryGetValue(e.UserId, out keys))
                {
                    keys = new List <string>();
                    _changedKeys[e.UserId] = keys;
                }

                keys.Add(e.Key);
            }
        }
Exemple #2
0
        private void UserManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason != UserDataSaveReason.UpdateUserRating)
            {
                return;
            }
            if (!e.Item.IsFavoriteOrLiked(e.User))
            {
                return;
            }

            var config = Plugin.Instance.Configuration;

            if (!config.UserPostsOptIn.Contains(e.User.Id))
            {
                return;
            }

            var type    = e.Item.GetType();
            var item    = type.Name == "Episode" ? LibraryManager.GetItemById(e.Item.Parent.Parent.InternalId) : e.Item;
            var message = $"{e.User.Name} likes the {type.Name}: {e.Item.Name} ";

            message += type.Name == "Episode" ? $" from the series {item.Name}" : "";

            var data = new Payload
            {
                message  = message,
                url      = $"{WanAddress}/emby/Items/{item.InternalId}/Images/Primary?maxHeight=1108&amp;maxWidth=800&amp;quality=90",
                endpoint = "me/photos"
            };

            FacebookClient.PostToPage(data, Logger, HttpClient, config);
        }
Exemple #3
0
 void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
 {
     if (e.SaveReason == UserDataSaveReason.PlaybackFinished || e.SaveReason == UserDataSaveReason.TogglePlayed || e.SaveReason == UserDataSaveReason.UpdateUserRating)
     {
         SaveMetadataForItem(e.Item, ItemUpdateType.MetadataDownload);
     }
 }
Exemple #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            // ignore change events for any reason other than manually toggling played.
            if (e.SaveReason != UserDataSaveReason.TogglePlayed)
            {
                return;
            }

            var baseItem = e.Item as BaseItem;

            if (baseItem != null)
            {
                // determine if user has trakt credentials
                var traktUser = UserHelper.GetTraktUser(e.UserId.ToString());

                // Can't progress
                if (traktUser == null || baseItem.Path == null || baseItem.LocationType == LocationType.Virtual || (!(baseItem is Movie) && !(baseItem is Episode)))
                {
                    return;
                }

                foreach (var s in traktUser.TraktLocations.Where(s => baseItem.Path.StartsWith(s + Path.DirectorySeparatorChar)))
                {
                    // We have a user and the item is in a trakt monitored location.
                    _userDataManagerEventsHelper.ProcessUserDataSaveEventArgs(e, traktUser);
                }
            }
        }
Exemple #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            // ignore change events for any reason other than manually toggling played.
            if (e.SaveReason != UserDataSaveReason.TogglePlayed)
            {
                return;
            }

            var baseItem = e.Item as BaseItem;

            if (baseItem != null)
            {
                // determine if user has trakt credentials
                var traktUser = UserHelper.GetTraktUser(e.UserId.ToString());

                // Can't progress
                if (traktUser == null || !_traktApi.CanSync(baseItem, traktUser))
                {
                    return;
                }

                // We have a user and the item is in a trakt monitored location.
                _userDataManagerEventsHelper.ProcessUserDataSaveEventArgs(e, traktUser);
            }
        }
Exemple #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnUserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            // ignore change events for any reason other than manually toggling played.
            if (e.SaveReason != UserDataSaveReason.TogglePlayed)
            {
                return;
            }

            if (e.Item is BaseItem baseItem)
            {
                // determine if user has trakt credentials
                var traktUser = UserHelper.GetTraktUser(e.UserId);

                // Can't progress
                if (traktUser == null || !_traktApi.CanSync(baseItem, traktUser))
                {
                    return;
                }

                if (!traktUser.PostSetWatched && !traktUser.PostSetUnwatched)
                {
                    // User doesn't want to post any status changes at all.
                    return;
                }

                // We have a user who wants to post updates and the item is in a trakt monitored location.
                _userDataManagerEventsHelper.ProcessUserDataSaveEventArgs(e, traktUser);
            }
        }
Exemple #7
0
 private void OnUserDataSaved(object?sender, UserDataSaveEventArgs e)
 {
     if (e.SaveReason == UserDataSaveReason.PlaybackFinished || e.SaveReason == UserDataSaveReason.TogglePlayed || e.SaveReason == UserDataSaveReason.UpdateUserRating)
     {
         if (!string.IsNullOrWhiteSpace(_config.GetNfoConfiguration().UserId))
         {
             _ = SaveMetadataForItemAsync(e.Item, ItemUpdateType.MetadataDownload);
         }
     }
 }
Exemple #8
0
        void UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
            {
                return;
            }

            var message = $"InfuseSync received user data for item '{e.Item.Name}' of type '{e.Item.GetClientTypeName()}' Guid '{e.Item.Id}'";

#if EMBY
            message += $" ItemID '{e.Item.GetClientId()}'";
#endif
            _logger.LogDebug(message);

            lock (_syncLock)
            {
                if (e.Item != null)
                {
                    if (!Shared.ShouldSyncUpdatedItem(e.Item))
                    {
                        return;
                    }

                    if (UpdateTimer == null)
                    {
                        UpdateTimer = new Timer(
                            TimerCallback,
                            null,
                            UpdateDuration,
                            Timeout.Infinite
                            );
                    }
                    else
                    {
                        UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
                    }
#if EMBY
                    var userId = e.User.Id;
#else
                    var userId = e.UserId;
#endif
                    if (!_changedItems.TryGetValue(userId, out var keys))
                    {
                        keys = new List <BaseItem>();
                        _changedItems[userId] = keys;
                    }

                    keys.Add(e.Item);

                    _logger.LogDebug($"InfuseSync will save user data for item {e.Item.Id} user {userId}");
                }
            }
        }
Exemple #9
0
        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason == UserDataSaveReason.PlaybackFinished || e.SaveReason == UserDataSaveReason.TogglePlayed || e.SaveReason == UserDataSaveReason.UpdateUserRating)
            {
                var item = e.Item as BaseItem;

                if (!string.IsNullOrWhiteSpace(_config.GetNfoConfiguration().UserId))
                {
                    SaveMetadataForItem(item, ItemUpdateType.MetadataEdit);
                }
            }
        }
Exemple #10
0
        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
            {
                return;
            }

            lock (_syncLock)
            {
                var testItem = e.Item;

                if (testItem != null)
                {
                    if (!FilterItem(testItem, out var type))
                    {
                        return;
                    }

                    if (UpdateTimer == null)
                    {
                        UpdateTimer = new Timer(UpdateTimerCallback, null, UpdateDuration,
                                                Timeout.Infinite);
                    }
                    else
                    {
                        UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
                    }

                    if (!_changedItems.TryGetValue(e.UserId, out var keys))
                    {
                        keys = new List <BaseItem>();
                        _changedItems[e.UserId] = keys;
                    }

                    keys.Add(e.Item);

                    // Go up one level for indicators
                    _itemRef.Add(new LibItem
                    {
                        Id       = testItem.Id,
                        ItemType = type,
                    });

                    var parent = testItem.Parent;

                    if (parent != null)
                    {
                        keys.Add(parent);
                    }
                }
            }
        }
Exemple #11
0
 private void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
 {
     if (e.SaveReason == UserDataSaveReason.PlaybackFinished ||
         e.SaveReason == UserDataSaveReason.UpdateUserRating || e.SaveReason == UserDataSaveReason.TogglePlayed)
     {
         if (Const.ListenForChangeItemTypes.Contains(e.Item.GetType()))
         {
             e.Item.IsFavorite     = e.UserData.IsFavorite;
             e.Item.PlayCount      = e.UserData.PlayCount;
             e.Item.LastPlayedDate = e.UserData.LastPlayedDate;
             e.Item.Played         = e.UserData.Played;
             e.Item.Rating         = e.UserData.Rating;
             _updatedItemsQueue.Enqueue(e.Item);
         }
     }
 }
        public async Task AddEvent(UserConfig user, UserDataSaveEventArgs args)
        {
            if (args.Item is not Episode episode)
            {
                return;
            }

            var episodes = _episodes.FirstOrDefault(e => e.User.Equals(user));

            if (episodes == default(MarkedEpisodes))
            {
                episodes = new MarkedEpisodes {
                    User = user
                };
                _episodes.Add(episodes);
            }

            if (!episodes.CurrentSeriesId.Equals(episode.Series.Id))
            {
                if (episodes.CurrentSeriesId != default)
                {
                    await SendData(episodes);
                }
                episodes.CurrentSeriesId = episode.Series.Id;
            }

            if (args.UserData.Played)
            {
                episodes.SeenEpisodes.Add(episode);
                if (episodes.UnSeenEpisodes.Contains(episode))
                {
                    episodes.UnSeenEpisodes.Remove(episode);
                }
            }
            else
            {
                episodes.UnSeenEpisodes.Add(episode);
                if (episodes.SeenEpisodes.Contains(episode))
                {
                    episodes.SeenEpisodes.Remove(episode);
                }
            }

            Postpone();
        }
        void OnUserDataManagerUserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
            {
                return;
            }

            lock (_syncLock)
            {
                if (_updateTimer == null)
                {
                    _updateTimer = new Timer(
                        UpdateTimerCallback,
                        null,
                        UpdateDuration,
                        Timeout.Infinite);
                }
                else
                {
                    _updateTimer.Change(UpdateDuration, Timeout.Infinite);
                }

                if (!_changedItems.TryGetValue(e.UserId, out List <BaseItem> keys))
                {
                    keys = new List <BaseItem>();
                    _changedItems[e.UserId] = keys;
                }

                keys.Add(e.Item);

                var baseItem = e.Item;

                // Go up one level for indicators
                if (baseItem != null)
                {
                    var parent = baseItem.GetOwner() ?? baseItem.GetParent();

                    if (parent != null)
                    {
                        keys.Add(parent);
                    }
                }
            }
        }
Exemple #14
0
        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            if (e.SaveReason == UserDataSaveReason.PlaybackProgress)
            {
                return;
            }

            lock (_syncLock)
            {
                if (UpdateTimer == null)
                {
                    UpdateTimer = _timerFactory.Create(UpdateTimerCallback, null, UpdateDuration,
                                                       Timeout.Infinite);
                }
                else
                {
                    UpdateTimer.Change(UpdateDuration, Timeout.Infinite);
                }

                List <IHasUserData> keys;

                if (!_changedItems.TryGetValue(e.UserId, out keys))
                {
                    keys = new List <IHasUserData>();
                    _changedItems[e.UserId] = keys;
                }

                keys.Add(e.Item);

                var baseItem = e.Item as BaseItem;

                // Go up one level for indicators
                if (baseItem != null)
                {
                    var parent = baseItem.GetParent();

                    if (parent != null)
                    {
                        keys.Add(parent);
                    }
                }
            }
        }
Exemple #15
0
        private async void OnUserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            HookEvent evt;

            switch (e.SaveReason)
            {
            case UserDataSaveReason.TogglePlayed:
                evt = e.UserData.Played ? HookEvent.MarkPlayed : HookEvent.MarkUnplayed;
                break;

            case UserDataSaveReason.UpdateUserRating:
                evt = HookEvent.Rate;
                break;

            default:
                return;
            }

            var user = _userManager.GetUserById(e.UserId);

            await PlaybackEvent(evt, e.Item, null, user);
        }
Exemple #16
0
        void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            var userId = _config.GetNfoConfiguration().UserId;

            if (string.IsNullOrWhiteSpace(userId))
            {
                return;
            }

            if (e.SaveReason == UserDataSaveReason.PlaybackFinished || e.SaveReason == UserDataSaveReason.TogglePlayed)
            {
                var item = e.Item as BaseItem;

                if (item != null)
                {
                    if (!item.IsFolder && !(item is IItemByName))
                    {
                        SaveMetadataForItem(item, ItemUpdateType.MetadataEdit);
                    }
                }
            }
        }
Exemple #17
0
        private async void UserDataSavedHandler(object?sender, UserDataSaveEventArgs eventArgs)
        {
            try
            {
                if (eventArgs.Item is null)
                {
                    return;
                }

                if (eventArgs.Item.IsThemeMedia)
                {
                    // Don't report theme song or local trailer playback.
                    return;
                }

                var user = _userManager.GetUserById(eventArgs.UserId);
                if (user is null)
                {
                    return;
                }

                var dataObject = DataObjectHelpers
                                 .GetBaseDataObject(_applicationHost, NotificationType.UserDataSaved)
                                 .AddBaseItemData(eventArgs.Item)
                                 .AddUserItemData(eventArgs.UserData);

                dataObject["SaveReason"]           = eventArgs.SaveReason.ToString();
                dataObject["NotificationUsername"] = user.Username;
                dataObject["UserId"] = user.Id;

                await _webhookSender.SendNotification(NotificationType.UserDataSaved, dataObject, eventArgs.Item.GetType())
                .ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                _logger.LogWarning(ex, "Unable to send notification");
            }
        }
        /// <summary>
        ///     Let last fm know when a user favourites or unfavourites a track
        /// </summary>
        private async void UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            //We only care about audio
            if (!(e.Item is Audio))
            {
                return;
            }

            //We also only care about User rating changes
            if (!e.SaveReason.Equals(UserDataSaveReason.UpdateUserRating))
            {
                return;
            }

            var lastfmUser = UserHelpers.GetUser(e.UserId);

            if (lastfmUser == null)
            {
                Plugin.Logger.Debug("Could not find user");
                return;
            }

            if (string.IsNullOrWhiteSpace(lastfmUser.SessionKey))
            {
                Plugin.Logger.Info("No session key present, aborting");
                return;
            }

            var item = (Audio)e.Item;

            //Dont do if syncing
            if (Plugin.Syncing)
            {
                return;
            }

            await _lastfmApi.TrackLove(item, lastfmUser, e.UserData.IsFavorite);
        }
        /// <summary>
        /// Let last fm know when a user favourites or unfavourites a track
        /// </summary>
        async void UserDataSaved(object sender, UserDataSaveEventArgs e)
        {
            // We only care about audio
            if (!(e.Item is Audio))
            {
                return;
            }

            // We also only care about User rating changes
            if (!e.SaveReason.Equals(UserDataSaveReason.UpdateUserRating))
            {
                return;
            }

            var lastfmUser = Utils.UserHelpers.GetUser(e.UserId);

            if (lastfmUser == null)
            {
                _logger.LogDebug("Could not find user");
                return;
            }

            if (string.IsNullOrWhiteSpace(lastfmUser.SessionKey))
            {
                _logger.LogInformation("No session key present, aborting");
                return;
            }

            var item = e.Item as Audio;

            // Dont do if syncing
            if (Plugin.Syncing)
            {
                return;
            }

            await _apiClient.LoveTrack(item, lastfmUser, e.UserData.IsFavorite).ConfigureAwait(false);
        }
Exemple #20
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="userDataSaveEventArgs"></param>
        /// <param name="traktUser"></param>
        public async Task ProcessUserDataSaveEventArgs(UserDataSaveEventArgs userDataSaveEventArgs, TraktUser traktUser, CancellationToken cancellationToken)
        {
            var userPackage = _userDataPackages.FirstOrDefault(e => e.TraktUser.Equals(traktUser));

            if (userPackage == null)
            {
                userPackage = new UserDataPackage {
                    TraktUser = traktUser
                };
                _userDataPackages.Add(userPackage);
            }


            if (_timer == null)
            {
                _timer = new Timer(OnTimerCallback, null, TimeSpan.FromMilliseconds(5000),
                                   Timeout.InfiniteTimeSpan);
            }
            else
            {
                _timer.Change(TimeSpan.FromMilliseconds(5000), Timeout.InfiniteTimeSpan);
            }

            var movie = userDataSaveEventArgs.Item as Movie;

            if (movie != null)
            {
                if (userDataSaveEventArgs.UserData.Played)
                {
                    userPackage.SeenMovies.Add(movie);

                    if (userPackage.SeenMovies.Count >= 100)
                    {
                        await _traktApi.SendMoviePlaystateUpdates(userPackage.SeenMovies, userPackage.TraktUser, true, true,
                                                                  cancellationToken).ConfigureAwait(false);

                        userPackage.SeenMovies = new List <Movie>();
                    }

                    await MovieStatusUpdate(movie, userPackage.TraktUser, cancellationToken).ConfigureAwait(false);
                }
                else
                {
                    userPackage.UnSeenMovies.Add(movie);

                    if (userPackage.UnSeenMovies.Count >= 100)
                    {
                        await _traktApi.SendMoviePlaystateUpdates(userPackage.UnSeenMovies, userPackage.TraktUser, true, false,
                                                                  cancellationToken).ConfigureAwait(false);

                        userPackage.UnSeenMovies = new List <Movie>();
                    }
                }

                return;
            }

            var episode = userDataSaveEventArgs.Item as Episode;

            if (episode == null)
            {
                return;
            }

            // If it's not the series we're currently storing, upload our episodes and reset the arrays
            if (!userPackage.CurrentSeriesId.Equals(episode.Series.Id))
            {
                if (userPackage.SeenEpisodes.Any())
                {
                    await _traktApi.SendEpisodePlaystateUpdates(userPackage.SeenEpisodes, userPackage.TraktUser, true, true,
                                                                cancellationToken).ConfigureAwait(false);

                    userPackage.SeenEpisodes = new List <Episode>();
                }

                if (userPackage.UnSeenEpisodes.Any())
                {
                    await _traktApi.SendEpisodePlaystateUpdates(userPackage.UnSeenEpisodes, userPackage.TraktUser, true, false,
                                                                cancellationToken).ConfigureAwait(false);

                    userPackage.UnSeenEpisodes = new List <Episode>();
                }

                userPackage.CurrentSeriesId = episode.Series.Id;
            }

            if (userDataSaveEventArgs.UserData.Played)
            {
                userPackage.SeenEpisodes.Add(episode);

                await EpisodeStatusUpdate(episode, traktUser, cancellationToken).ConfigureAwait(false);
            }
            else
            {
                userPackage.UnSeenEpisodes.Add(episode);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="userDataSaveEventArgs"></param>
        /// <param name="traktUser"></param>
        public void ProcessUserDataSaveEventArgs(UserDataSaveEventArgs userDataSaveEventArgs, TraktUser traktUser)
        {
            var userPackage = _userDataPackages.FirstOrDefault(e => e.TraktUser.Equals(traktUser));

            if (userPackage == null)
            {
                userPackage = new UserDataPackage {
                    TraktUser = traktUser
                };
                _userDataPackages.Add(userPackage);
            }


            if (_timer == null)
            {
                _timer          = new Timer(5000);
                _timer.Elapsed += TimerElapsed;
            }

            if (_timer.Enabled)
            {
                _timer.Stop();
                _timer.Start();
            }
            else
            {
                _timer.Start();
            }

            var movie = userDataSaveEventArgs.Item as Movie;

            if (movie != null)
            {
                if (userDataSaveEventArgs.UserData.Played)
                {
                    userPackage.SeenMovies.Add(movie);

                    if (userPackage.SeenMovies.Count >= 100)
                    {
                        _traktApi.SendMoviePlaystateUpdates(userPackage.SeenMovies, userPackage.TraktUser, true,
                                                            CancellationToken.None).ConfigureAwait(false);
                        userPackage.SeenMovies = new List <Movie>();
                    }
                }
                else
                {
                    userPackage.UnSeenMovies.Add(movie);

                    if (userPackage.UnSeenMovies.Count >= 100)
                    {
                        _traktApi.SendMoviePlaystateUpdates(userPackage.UnSeenMovies, userPackage.TraktUser, false,
                                                            CancellationToken.None).ConfigureAwait(false);
                        userPackage.UnSeenMovies = new List <Movie>();
                    }
                }

                return;
            }

            var episode = userDataSaveEventArgs.Item as Episode;

            if (episode == null)
            {
                return;
            }

            // If it's not the series we're currently storing, upload our episodes and reset the arrays
            if (!userPackage.CurrentSeriesId.Equals(episode.Series.Id))
            {
                if (userPackage.SeenEpisodes.Any())
                {
                    _traktApi.SendEpisodePlaystateUpdates(userPackage.SeenEpisodes, userPackage.TraktUser, true,
                                                          CancellationToken.None).ConfigureAwait(false);
                    userPackage.SeenEpisodes = new List <Episode>();
                }

                if (userPackage.UnSeenEpisodes.Any())
                {
                    _traktApi.SendEpisodePlaystateUpdates(userPackage.UnSeenEpisodes, userPackage.TraktUser, false,
                                                          CancellationToken.None).ConfigureAwait(false);
                    userPackage.SeenEpisodes = new List <Episode>();
                }

                userPackage.CurrentSeriesId = episode.Series.Id;
            }

            if (userDataSaveEventArgs.UserData.Played)
            {
                userPackage.SeenEpisodes.Add(episode);
            }
            else
            {
                userPackage.UnSeenEpisodes.Add(episode);
            }
        }