public TaskNotifictionMediaReport(IActivityManager activity, ILogManager logger, IServerConfigurationManager config, IFileSystem fileSystem, IServerApplicationHost appHost, INotificationManager notificationManager, IUserManager userManager, ILibraryManager libraryManager, IUserViewManager userViewManager) { _logger = logger.GetLogger("NewMediaReportNotification - TaskNotifictionReport"); _activity = activity; _config = config; _fileSystem = fileSystem; _notificationManager = notificationManager; _userManager = userManager; _libraryManager = libraryManager; _userViewManager = userViewManager; _appHost = appHost; if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false) { _logger.Info("ERROR : Plugin not compatible with this server version"); throw new NotImplementedException("This task is not available on this version of Emby"); } _logger.Info("NewMediaReportNotification Loaded"); }
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(() => { BackupManager backup = new BackupManager(_config, _logger, _fileSystem); backup.SaveBackup(); }, cancellationToken); }
public TaskCleanDb(IActivityManager activity, ILogManager logger, IServerConfigurationManager config, IFileSystem fileSystem, IServerApplicationHost appHost) { _logger = logger.GetLogger("PlaybackReporting - TaskCleanDb"); _activity = activity; _config = config; _fileSystem = fileSystem; _appHost = appHost; if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false) { _logger.Info("ERROR : Plugin not compatible with this server version"); throw new NotImplementedException("This task is not available on this version of Emby"); } }
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] {
public TaskCreatePlaylists(ILogManager logger, IPlaylistManager playlistman, IServerApplicationHost appHost, ILibraryManager libraryManager, IServerConfigurationManager config, IFileSystem fileSystem) { _logger = logger.GetLogger("PlaybackReporting - CreatePlaylists"); _playlistman = playlistman; _appHost = appHost; _libraryManager = libraryManager; _config = config; _fileSystem = fileSystem; if (VersionCheck.IsVersionValid(_appHost.ApplicationVersion, _appHost.SystemUpdateLevel) == false) { _logger.Info("ERROR : Plugin not compatible with this server version"); throw new NotImplementedException("This task is not available on this version of Emby"); } }
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); }
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); }