public CL_AnimeEpisode_User GetUserContract(int userid)
        {
            SVR_AnimeEpisode_User rr = GetUserRecord(userid);

            if (rr != null)
            {
                return(rr.Contract);
            }

            using (var upd = Repo.Instance.AnimeEpisode_User.BeginAddOrUpdate(() => GetUserRecord(userid)))
            {
                upd.Entity.PlayedCount    = 0;
                upd.Entity.StoppedCount   = 0;
                upd.Entity.WatchedCount   = 0;
                upd.Entity.AnimeEpisodeID = AnimeEpisodeID;
                upd.Entity.AnimeSeriesID  = AnimeSeriesID;
                upd.Entity.JMMUserID      = userid;
                upd.Entity.WatchedDate    = GetVideoLocals().Select(vid => vid.GetUserRecord(userid))
                                            .FirstOrDefault(vid => vid?.WatchedDate != null)?.WatchedDate;

                rr = upd.Commit();
            }

            return(rr.Contract);
        }
        public CL_AnimeEpisode_User GetUserContract(int userid, ISessionWrapper session = null)
        {
            lock (_lock) //Make it atomic on creation
            {
                SVR_AnimeEpisode_User rr = GetUserRecord(userid);
                if (rr != null)
                {
                    return(rr.Contract);
                }
                rr = new SVR_AnimeEpisode_User
                {
                    PlayedCount    = 0,
                    StoppedCount   = 0,
                    WatchedCount   = 0,
                    AnimeEpisodeID = this.AnimeEpisodeID,
                    AnimeSeriesID  = this.AnimeSeriesID,
                    JMMUserID      = userid,
                    WatchedDate    = null
                };
                if (session != null)
                {
                    RepoFactory.AnimeEpisode_User.SaveWithOpenTransaction(session, rr);
                }
                else
                {
                    RepoFactory.AnimeEpisode_User.Save(rr);
                }

                return(rr.Contract);
            }
        }
        public CL_AnimeEpisode_User GetUserContract(int userid, ISessionWrapper session = null)
        {
            SVR_AnimeEpisode_User rr = GetUserRecord(userid);

            if (rr != null)
            {
                return(rr.Contract);
            }
            rr = new SVR_AnimeEpisode_User
            {
                PlayedCount    = 0,
                StoppedCount   = 0,
                WatchedCount   = 0,
                AnimeEpisodeID = AnimeEpisodeID,
                AnimeSeriesID  = AnimeSeriesID,
                JMMUserID      = userid,
                WatchedDate    = GetVideoLocals().Select(vid => vid.GetUserRecord(userid))
                                 .FirstOrDefault(vid => vid?.WatchedDate != null)?.WatchedDate
            };
            if (session != null)
            {
                RepoFactory.AnimeEpisode_User.SaveWithOpenTransaction(session, rr);
            }
            else
            {
                RepoFactory.AnimeEpisode_User.Save(rr);
            }

            return(rr.Contract);
        }
        public void SaveWatchedStatus(bool watched, int userID, DateTime?watchedDate, bool updateWatchedDate)
        {
            SVR_AnimeEpisode_User epUserRecord = this.GetUserRecord(userID);

            if (watched)
            {
                // lets check if an update is actually required
                if (epUserRecord != null)
                {
                    if (epUserRecord.WatchedDate.HasValue && watchedDate.HasValue &&
                        epUserRecord.WatchedDate.Value.Equals(watchedDate.Value))
                    {
                        // this will happen when we are adding a new file for an episode where we already had another file
                        // and the file/episode was watched already
                        return;
                    }
                }

                if (epUserRecord == null)
                {
                    epUserRecord = new SVR_AnimeEpisode_User
                    {
                        PlayedCount  = 0,
                        StoppedCount = 0,
                        WatchedCount = 0
                    };
                }
                epUserRecord.AnimeEpisodeID = this.AnimeEpisodeID;
                epUserRecord.AnimeSeriesID  = this.AnimeSeriesID;
                epUserRecord.JMMUserID      = userID;
                epUserRecord.WatchedCount++;

                if (watchedDate.HasValue)
                {
                    if (updateWatchedDate)
                    {
                        epUserRecord.WatchedDate = watchedDate.Value;
                    }
                }

                if (!epUserRecord.WatchedDate.HasValue)
                {
                    epUserRecord.WatchedDate = DateTime.Now;
                }

                RepoFactory.AnimeEpisode_User.Save(epUserRecord);
            }
            else
            {
                if (epUserRecord != null)
                {
                    RepoFactory.AnimeEpisode_User.Delete(epUserRecord.AnimeEpisode_UserID);
                }
            }
        }
        public void SaveWatchedStatus(bool watched, int userID, DateTime?watchedDate, bool updateWatchedDate)
        {
            SVR_AnimeEpisode_User epUserRecord = GetUserRecord(userID);

            if (watched)
            {
                // lets check if an update is actually required
                if (epUserRecord?.WatchedDate != null && watchedDate != null &&
                    epUserRecord.WatchedDate.Equals(watchedDate.Value) ||
                    (epUserRecord?.WatchedDate == null && watchedDate == null))
                {
                    return;
                }

                if (epUserRecord == null)
                {
                    epUserRecord = new SVR_AnimeEpisode_User
                    {
                        PlayedCount  = 0,
                        StoppedCount = 0,
                        WatchedCount = 0
                    }
                }
                ;
                epUserRecord.AnimeEpisodeID = AnimeEpisodeID;
                epUserRecord.AnimeSeriesID  = AnimeSeriesID;
                epUserRecord.JMMUserID      = userID;
                epUserRecord.WatchedCount++;

                if (watchedDate.HasValue)
                {
                    if (updateWatchedDate)
                    {
                        epUserRecord.WatchedDate = watchedDate.Value;
                    }
                }

                if (!epUserRecord.WatchedDate.HasValue)
                {
                    epUserRecord.WatchedDate = DateTime.Now;
                }

                RepoFactory.AnimeEpisode_User.Save(epUserRecord);
            }
            else
            {
                if (epUserRecord != null)
                {
                    RepoFactory.AnimeEpisode_User.Delete(epUserRecord.AnimeEpisode_UserID);
                }
            }
        }
        public void SaveWatchedStatus(bool watched, int userID, DateTime?watchedDate, bool updateWatchedDate)
        {
            SVR_AnimeEpisode_User epUserRecord = GetUserRecord(userID);

            if (watched)
            {
                using (var upd = Repo.Instance.AnimeEpisode_User.BeginAddOrUpdate(() => GetUserRecord(userID)))
                {
                    // lets check if an update is actually required
                    if (upd.Entity?.WatchedDate != null && watchedDate != null &&
                        upd.Entity.WatchedDate.Equals(watchedDate.Value) ||
                        (upd.Entity?.WatchedDate == null && watchedDate == null))
                    {
                        return;
                    }

                    upd.Entity.AnimeEpisodeID = AnimeEpisodeID;
                    upd.Entity.AnimeSeriesID  = AnimeSeriesID;
                    upd.Entity.JMMUserID      = userID;
                    upd.Entity.WatchedCount++;

                    if (watchedDate.HasValue)
                    {
                        if (updateWatchedDate)
                        {
                            upd.Entity.WatchedDate = watchedDate.Value;
                        }
                    }

                    if (!upd.Entity.WatchedDate.HasValue)
                    {
                        upd.Entity.WatchedDate = DateTime.Now;
                    }

                    // lets check if an update is actually required
                    if (upd.Entity?.WatchedDate != null && watchedDate != null &&
                        upd.Entity.WatchedDate.Equals(watchedDate.Value) ||
                        (upd.Entity?.WatchedDate == null && watchedDate == null))
                    {
                        return;
                    }

                    upd.Entity.AnimeEpisodeID = AnimeEpisodeID;
                    upd.Entity.AnimeSeriesID  = AnimeSeriesID;
                    upd.Entity.JMMUserID      = userID;
                    upd.Entity.WatchedCount++;

                    if (watchedDate.HasValue)
                    {
                        if (updateWatchedDate)
                        {
                            upd.Entity.WatchedDate = watchedDate.Value;
                        }
                    }

                    if (!upd.Entity.WatchedDate.HasValue)
                    {
                        upd.Entity.WatchedDate = DateTime.Now;
                    }
                    epUserRecord = upd.Commit();
                }
            }
            else
            {
                if (epUserRecord != null)
                {
                    Repo.Instance.AnimeEpisode_User.Delete(epUserRecord.AnimeEpisode_UserID);
                }
            }
        }