public async System.Threading.Tasks.Task Execute(CancellationToken cancellationToken, IProgress <double> progress)
        {
            if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false)
            {
                _logger.Info("ERROR : Plugin not compatible with this server version");
                return;
            }

            UserViewQuery view_query = new UserViewQuery();

            view_query.IncludeExternalContent = false;
            view_query.IncludeHidden          = false;
            Folder[] views       = _userViewManager.GetUserViews(view_query);
            int      added_count = 0;

            ReportPlaybackOptions config = _config.GetReportPlaybackOptions();

            DateTime cutoff     = config.LastNewMediaCheck;
            string   last_check = cutoff.ToString("yyyy/MM/dd HH:mm:ss zzz");

            TimeSpan since_last = DateTime.Now - cutoff;

            _logger.Info("Cutoff DateTime for new items - date: " + last_check + " ago: " + since_last);

            string since_last_string = string.Format("{0}{1}{2}",
                                                     since_last.Duration().Days > 0 ? string.Format("{0:0} day{1} ", since_last.Days, since_last.Days == 1 ? String.Empty : "s") : string.Empty,
                                                     since_last.Duration().Hours > 0 ? string.Format("{0:0} hour{1} ", since_last.Hours, since_last.Hours == 1 ? String.Empty : "s") : string.Empty,
                                                     since_last.Duration().Minutes > 0 ? string.Format("{0:0} minute{1} ", since_last.Minutes, since_last.Minutes == 1 ? String.Empty : "s") : string.Empty);

            if (string.IsNullOrEmpty(since_last_string))
            {
                since_last_string = "0 minutes";
            }
            string message = "New media added since last check " + since_last_string + "ago.\r\n\r\n";

            foreach (Folder folder in views)
            {
                _logger.Info("Checking for new items in : " + folder.ToString());

                InternalItemsQuery query = new InternalItemsQuery();
                query.IncludeItemTypes = new string[] { "Movie", "Episode" };
                query.Parent           = folder;
                query.Recursive        = true;
                query.IsVirtualItem    = false;
                var sort = new (string, SortOrder)[1] {
Ejemplo n.º 2
0
        public async System.Threading.Tasks.Task Execute(CancellationToken cancellationToken, IProgress <double> progress)
        {
            if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false)
            {
                _logger.Info("ERROR : Plugin not compatible with this server version");
                return;
            }

            await System.Threading.Tasks.Task.Run(() =>
            {
                _logger.Info("Playback Reporting Data Trim");

                ReportPlaybackOptions config = _config.GetReportPlaybackOptions();

                int max_data_age = config.MaxDataAge;

                _logger.Info("MaxDataAge : " + max_data_age);

                if (max_data_age == -1)
                {
                    _logger.Info("Keep data forever, not doing any data cleanup");
                    return;
                }
                else if (max_data_age == 0)
                {
                    _logger.Info("Removing all data");
                    ActivityRepository repo = new ActivityRepository(_logger, _config.ApplicationPaths, _fileSystem);
                    repo.DeleteOldData(null);
                }
                else
                {
                    DateTime del_defore     = DateTime.Now.AddMonths(max_data_age * -1);
                    ActivityRepository repo = new ActivityRepository(_logger, _config.ApplicationPaths, _fileSystem);
                    repo.DeleteOldData(del_defore);
                }
            }, cancellationToken);
        }
Ejemplo n.º 3
0
        public async System.Threading.Tasks.Task Execute(CancellationToken cancellationToken, IProgress <double> progress)
        {
            if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false)
            {
                _logger.Info("ERROR : Plugin not compatible with this server version");
                return;
            }

            // query the user playback info for the most active movies
            ActivityRepository    repository = new ActivityRepository(_logger, _config.ApplicationPaths, _fileSystem);
            ReportPlaybackOptions config     = _config.GetReportPlaybackOptions();

            foreach (var activity_playlist in config.ActivityPlaylists)
            {
                string list_name = activity_playlist.Name;
                string list_type = activity_playlist.Type;
                int    list_days = activity_playlist.Days;
                int    list_size = activity_playlist.Size;

                _logger.Info("Activity Playlist - Name:" + list_name + " Type:" + list_type + " Days:" + list_days);

                string sql = "";
                sql += "SELECT ItemId, ";
                sql += "COUNT(DISTINCT(UserId)) as count, ";
                sql += "AVG(CAST(strftime('%Y%m%d%H%M', 'now', 'localtime') AS int) - CAST(strftime('%Y%m%d%H%M', DateCreated) AS int)) as av_age ";
                sql += "FROM PlaybackActivity ";
                sql += "WHERE ItemType = '" + list_type + "' ";
                sql += "AND DateCreated > datetime('now', '-" + list_days + " day', 'localtime') ";
                sql += "GROUP BY ItemId ";
                sql += "ORDER BY count DESC, av_age ASC ";
                sql += "LIMIT " + list_size;

                List <string>         cols          = new List <string>();
                List <List <Object> > query_results = new List <List <object> >();
                repository.RunCustomQuery(sql, cols, query_results);

                List <long> items = new List <long>();
                foreach (List <Object> row in query_results)
                {
                    long item_id = long.Parse((string)row[0]);
                    items.Add(item_id);
                }

                // create a playlist with the most active movies
                string             playlist_name = list_name;
                InternalItemsQuery query         = new InternalItemsQuery();
                query.IncludeItemTypes = new string[] { "Playlist" };
                query.Name             = playlist_name;

                BaseItem[] results = _libraryManager.GetItemList(query, false);
                foreach (BaseItem item in results)
                {
                    _logger.Info("Deleting Existing Movie Playlist : " + item.InternalId);
                    DeleteOptions delete_options = new DeleteOptions();
                    delete_options.DeleteFileLocation = true;
                    _libraryManager.DeleteItem(item, delete_options);
                }

                _logger.Info("Creating Movie Playlist");
                PlaylistCreationRequest create_options = new PlaylistCreationRequest();
                create_options.Name = playlist_name;

                if (list_type == "Movie")
                {
                    create_options.MediaType = "Movie";
                }
                else
                {
                    create_options.MediaType = "Episode";
                }

                create_options.ItemIdList = items.ToArray();
                await _playlistman.CreatePlaylist(create_options).ConfigureAwait(false);
            }
        }
        public async System.Threading.Tasks.Task Execute(CancellationToken cancellationToken, IProgress <double> progress)
        {
            if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false)
            {
                _logger.Info("ERROR : Plugin not compatible with this server version");
                return;
            }

            Dictionary <string, string> user_map = new Dictionary <string, string>();

            foreach (var user in _userManager.Users)
            {
                string user_id   = user.Id.ToString("N");
                string user_name = user.Name;
                if (!string.IsNullOrEmpty(user_id) && !string.IsNullOrEmpty(user_name))
                {
                    user_map.Add(user.Id.ToString("N"), user.Name);
                }
            }

            ActivityRepository    repository = new ActivityRepository(_logger, _config.ApplicationPaths, _fileSystem);
            ReportPlaybackOptions config     = _config.GetReportPlaybackOptions();

            DateTime last_checked = config.LastUserActivityCheck;
            string   date_from    = last_checked.ToString("yyyy-MM-dd HH:mm:ss.FFFFFFF", CultureInfo.InvariantCulture);

            string sql = "";

            sql += "SELECT UserId, ItemType, ItemName, SUM(PlayDuration - PauseDuration) AS PlayTime ";
            sql += "FROM PlaybackActivity ";
            sql += "WHERE DateCreated > '" + date_from + "' "; // datetime('now', '-1 day', 'localtime') ";
            sql += "GROUP BY UserId, ItemType, ItemName";

            _logger.Info("Activity Query : " + sql);

            List <string>         cols    = new List <string>();
            List <List <Object> > results = new List <List <object> >();

            repository.RunCustomQuery(sql, cols, results);

            TimeSpan since_last = DateTime.Now - last_checked;

            _logger.Info("Cutoff DateTime for new items - date: " + date_from + " ago: " + since_last);

            string since_last_string = string.Format("{0}{1}{2}",
                                                     since_last.Duration().Days > 0 ? string.Format("{0:0} day{1} ", since_last.Days, since_last.Days == 1 ? String.Empty : "s") : string.Empty,
                                                     since_last.Duration().Hours > 0 ? string.Format("{0:0} hour{1} ", since_last.Hours, since_last.Hours == 1 ? String.Empty : "s") : string.Empty,
                                                     since_last.Duration().Minutes > 0 ? string.Format("{0:0} minute{1} ", since_last.Minutes, since_last.Minutes == 1 ? String.Empty : "s") : string.Empty);

            if (string.IsNullOrEmpty(since_last_string))
            {
                since_last_string = "0 minutes";
            }
            string message = "User activity since last check " + since_last_string + "ago.\r\n";

            int    item_count = 0;
            string last_user  = "";

            foreach (List <Object> row in results)
            {
                string   user_id          = (string)row[0];
                string   item_type        = (string)row[1];
                string   item_name        = (string)row[2];
                int      item_playtime    = int.Parse((string)row[3]);
                TimeSpan play_span        = TimeSpan.FromSeconds(item_playtime);
                string   play_time_string = string.Format("{0:D2}:{1:D2}:{2:D2}",
                                                          play_span.Hours,
                                                          play_span.Minutes,
                                                          play_span.Seconds);

                if (play_span.Days > 0)
                {
                    play_time_string = string.Format("{0}.{1:D2}:{2:D2}:{3:D2}",
                                                     play_span.Days,
                                                     play_span.Hours,
                                                     play_span.Minutes,
                                                     play_span.Seconds);
                }

                if (last_user != user_id)
                {
                    string user_name = "Unknown:" + user_id;
                    if (!string.IsNullOrEmpty(user_id) && user_map.ContainsKey(user_id))
                    {
                        user_name = user_map[user_id];
                    }
                    message  += "\r\n" + user_name + "\r\n";
                    last_user = user_id;
                }
                item_count++;
                message += " - (" + item_type + ") " + item_name + " (" + play_time_string + ")\r\n";
            }

            _logger.Info("User activity Message : ItemCount : " + item_count);

            if (item_count > 0)
            {
                var notification = new NotificationRequest
                {
                    NotificationType = "UserActivityReportNotification",
                    Date             = DateTime.UtcNow,
                    Name             = "User Activity Report Notification",
                    Description      = message
                };
                await _notificationManager.SendNotification(notification, CancellationToken.None).ConfigureAwait(false);
            }

            config.LastUserActivityCheck = DateTime.Now;
            _config.SaveReportPlaybackOptions(config);
        }