private SyncUpdateInfo PopulateLibraryInfo(string userId, string lastRequestedDt,
                                                   IReadOnlyCollection <MediaType> filters)
        {
            var startTime = DateTime.UtcNow;

            _logger.LogDebug("Starting PopulateLibraryInfo...");

            var info = new SyncUpdateInfo();

            var userDt = DateTime.Parse(lastRequestedDt, CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);
            var dtl    = (long)userDt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
            var user   = _userManager.GetUserById(Guid.Parse(userId));

            var itemsAdded      = Plugin.Instance.DbRepo.GetItems(dtl, ItemStatus.Added, filters);
            var itemsRemoved    = Plugin.Instance.DbRepo.GetItems(dtl, ItemStatus.Removed, filters);
            var itemsUpdated    = Plugin.Instance.DbRepo.GetItems(dtl, ItemStatus.Updated, filters);
            var userDataChanged = Plugin.Instance.DbRepo.GetUserInfos(dtl, userId, filters);

            info.ItemsAdded      = GetAddedOrUpdatedItems(user, itemsAdded);
            info.ItemsRemoved    = itemsRemoved.Select(id => id.ToString("N")).ToList();
            info.ItemsUpdated    = GetAddedOrUpdatedItems(user, itemsUpdated);
            info.UserDataChanged = userDataChanged.Select(i => _jsonSerializer.DeserializeFromString <UserItemDataDto>(i.JsonData)).ToList();

            _logger.LogInformation("Added: {AddedCount}, Removed: {RemovedCount}, Updated: {UpdatedCount}, Changed User Data: {ChangedUserDataCount}",
                                   info.ItemsAdded.Count, info.ItemsRemoved.Count, info.ItemsUpdated.Count, info.UserDataChanged.Count);
            TimeSpan diffDate = DateTime.UtcNow - startTime;

            _logger.LogInformation("Request Finished Taking {TimeTaken}", diffDate.ToString("c"));

            return(info);
        }
Example #2
0
        public SyncUpdateInfo PopulateLibraryInfo(DateTimeOffset userDT)
        {
            var info = new SyncUpdateInfo();

            var dtl = (long)(userDT.ToUniversalTime().Subtract(new DateTimeOffset(1970, 1, 1, 0, 0, 0, 0, TimeSpan.Zero)).TotalSeconds);

            info.ItemsRemoved = DbRepo.Instance.GetItems(dtl);

            return(info);
        }
        public async Task <SyncUpdateInfo> PopulateLibraryInfo(string userId, string lastDT,
                                                               bool movies, bool tvshows, bool music,
                                                               bool musicvideos, bool boxsets)
        {
            var startTime = DateTime.UtcNow;

            _logger.LogDebug("Starting PopulateLibraryInfo...");
            var userDataChangedJson = new List <string>();

            var info = new SyncUpdateInfo();

            var userDT = DateTime.Parse(lastDT, CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);

            var dtl = (long)userDT.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;

            Task <List <string> > t1 = Task.Run(() =>
            {
                _logger.LogDebug("PopulateLibraryInfo:  Getting Items Added Info...");
                var data = DbRepo.Instance.GetItems(dtl, 0, movies, tvshows, music, musicvideos, boxsets);

                var user = _userManager.GetUserById(Guid.Parse(userId));

                List <BaseItem> items = new List <BaseItem>();
                data.ForEach(i =>
                {
                    var item = _libraryManager.GetItemById(i);
                    if (item != null)
                    {
                        items.Add(item);
                    }
                });

                var result = items.SelectMany(i => ApiUserCheck.TranslatePhysicalItemToUserLibrary(i, user, _libraryManager)).Select(i => i.Id.ToString("N")).Distinct().ToList();

                if (result.Count > 0)
                {
                    _logger.LogInformation("Added Items Found: {AddedItems}", string.Join(",", result.ToArray()));
                }
                else
                {
                    _logger.LogInformation("No Added Items Found!");
                }
                return(result);
            });

            Task <List <string> > t2 = Task.Run(() =>
            {
                _logger.LogDebug("PopulateLibraryInfo:  Getting Items Removed Info...");
                List <string> result = new List <string>();

                var data = DbRepo.Instance.GetItems(dtl, 2, movies, tvshows, music, musicvideos, boxsets);

                if (data != null && data.Any())
                {
                    data.ForEach(i => result.Add(i.ToString("N")));
                }

                if (result.Count > 0)
                {
                    _logger.LogInformation("Removed Items Found: {RemovedItems}", string.Join(",", result.ToArray()));
                }
                else
                {
                    _logger.LogInformation("No Removed Items Found!");
                }
                return(result);
            });

            Task <List <string> > t3 = Task.Run(() =>
            {
                _logger.LogDebug("PopulateLibraryInfo:  Getting Items Updated Info...");
                var data = DbRepo.Instance.GetItems(dtl, 1, movies, tvshows, music, musicvideos, boxsets);

                var user = _userManager.GetUserById(Guid.Parse(userId));

                List <BaseItem> items = new List <BaseItem>();
                data.ForEach(i =>
                {
                    var item = _libraryManager.GetItemById(i);
                    if (item != null)
                    {
                        items.Add(item);
                    }
                });

                var result = items.SelectMany(i => ApiUserCheck.TranslatePhysicalItemToUserLibrary(i, user, _libraryManager)).Select(i => i.Id.ToString("N")).Distinct().ToList();

                if (result.Count > 0)
                {
                    _logger.LogInformation("Updated Items Found: {UpdatedItems}", string.Join(",", result));
                }
                else
                {
                    _logger.LogInformation("No Updated Items Found!");
                }
                return(result);
            });

            Task <List <string> > t4 = Task.Run(() =>
            {
                _logger.LogDebug("PopulateLibraryInfo:  Getting User Data Changed Info...");
                var data = DbRepo.Instance.GetUserInfos(dtl, userId, movies, tvshows, music, musicvideos, boxsets);

                var result = data.Select(i => i.JsonData).ToList();

                if (result.Count > 0)
                {
                    _logger.LogInformation("User Data Changed Info Found: {ChangedData}", string.Join(",", data.Select(i => i.Id).ToArray()));
                }
                else
                {
                    _logger.LogInformation("No User Data Changed Info Found!");
                }

                return(result);
            });

            await Task.WhenAll(t1, t2, t3, t4);

            info.ItemsAdded     = t1.Result;
            info.ItemsRemoved   = t2.Result;
            info.ItemsUpdated   = t3.Result;
            userDataChangedJson = t4.Result;

            info.UserDataChanged = userDataChangedJson.Select(i => _jsonSerializer.DeserializeFromString <UserItemDataDto>(i)).ToList();

            TimeSpan diffDate = DateTime.UtcNow - startTime;

            _logger.LogInformation("Request Finished Taking {TimeTaken}", diffDate.ToString("c"));

            return(info);
        }