示例#1
0
 private async Task <int> SaveIdolsAsync(IEnumerable <Idol> idols)
 {
     using (var db = new ImasCDDbContext(_ConnectionString))
     {
         db.Database.CommandTimeout = _Timeout;
         return(await db.SaveIdolsAsync(idols));
     }
 }
示例#2
0
 private async Task <bool> AnyImageDataAsync(string hash, IdolImageDataType type)
 {
     using (var db = new ImasCDDbContext(_ConnectionString))
     {
         db.Database.CommandTimeout = _Timeout;
         return(await db.IdolImageData.AnyAsync(_ => _.Hash == hash && _.Type == type));
     }
 }
示例#3
0
 private async Task <IdolImage> GetUnaquiredImageAsync(IdolImageDataType[] types)
 {
     using (var db = new ImasCDDbContext(_ConnectionString))
     {
         db.Database.CommandTimeout = _Timeout;
         return(await db.IdolImages.Include(_ => _.Idol)
                .FirstOrDefaultAsync(_ => !db.IdolImageData.Any(h => h.Hash == _.Hash && h.Type == IdolImageDataType.Framed)));
     }
 }
示例#4
0
        private async Task <int> GetUnaquiredImageCountAsync(IdolImageDataType[] types)
        {
            using (var db = new ImasCDDbContext(_ConnectionString))
            {
                db.Database.CommandTimeout = _Timeout;
                var tc = await db.IdolImages.CountAsync();

                var dc = await db.IdolImageData.CountAsync(_ => _.Data != null);

                return(tc * types.Length - dc);
            }
        }
示例#5
0
        private async Task SaveIdolImagesAsync(IEnumerable <IdolImage> images)
        {
            var imgDic = images.ToDictionary(_ => _.Hash);

            using (var db = new ImasCDDbContext(_ConnectionString))
            {
                db.Database.CommandTimeout = _Timeout;
                var dbImages = await db.IdolImages.ToDictionaryAsync(_ => _.Hash);

                foreach (var kv in imgDic)
                {
                    IdolImage d;
                    if (dbImages.TryGetValue(kv.Key, out d))
                    {
                        // 更新しない

                        //var s = kv.Value;

                        //d.Headline = !string.IsNullOrEmpty(s.Headline) ? s.Headline : d.Headline;
                        //d.Rarity = s.Rarity > 0 ? s.Rarity : d.Rarity;
                        //d.Type = s.Type > 0 ? s.Type : d.Type;
                        //d.BloodType = s.BloodType > 0 ? s.BloodType : d.BloodType;
                        //d.Height = s.Height > 0 ? s.Height : d.Height;
                        //d.Weight = s.Weight > 0 ? s.Weight : d.Weight;
                        //d.Bust = s.Bust > 0 ? s.Bust : d.Bust;
                        //d.Waist = s.Waist > 0 ? s.Waist : d.Waist;
                        //d.Hip = s.Hip > 0 ? s.Hip : d.Hip;
                        //d.Age = s.Age > 0 ? s.Age : d.Age;
                        //d.BirthMonth = s.BirthMonth > 0 ? s.BirthMonth : d.BirthMonth;
                        //d.BirthDay = s.BirthDay > 0 ? s.BirthDay : d.BirthDay;
                        //d.SunSign = s.SunSign > 0 ? s.SunSign : d.SunSign;
                        //d.Birthplace = !string.IsNullOrEmpty(s.Birthplace) ? s.Birthplace : d.Birthplace;
                        //d.Hobby = !string.IsNullOrEmpty(s.Hobby) ? s.Hobby : d.Hobby;
                        //d.Handedness = s.Handedness > 0 ? s.Handedness : d.Handedness;
                    }
                    else
                    {
                        if (kv.Value.Idol != null)
                        {
                            db.Idols.Attach(kv.Value.Idol);
                        }
                        db.IdolImages.Add(kv.Value);
                    }
                }

                await db.SaveChangesAsync();
            }
        }
示例#6
0
        public async Task <HttpResponseMessage> GetImageAsync(string hash, IdolImageDataType type)
        {
            using (var db = new ImasCDDbContext())
            {
                var d = await db.IdolImageData.FirstOrDefaultAsync(_ => _.Hash == hash && _.Type == type);

                if (d != null)
                {
                    if (d.Data == null)
                    {
                        throw new HttpResponseException(HttpStatusCode.NotFound);
                    }
                    return(CreateFileResult(d.Data, "image/jpeg"));
                }

                var u = IdolImageData.GetImageUrl(hash, type);

                byte[] data;
                using (var wc = new WebClient())
                {
                    try
                    {
                        data = await wc.DownloadDataTaskAsync(u);
                    }
                    catch
                    {
                        data = null;
                    }
                }

                db.IdolImageData.Add(new IdolImageData()
                {
                    Hash = hash,
                    Type = type,
                    Data = data
                });

                await db.SaveChangesAsync();

                if (data == null)
                {
                    throw new HttpResponseException(HttpStatusCode.NotFound);
                }
                return(CreateFileResult(data, "image/jpeg"));
            }
        }
示例#7
0
        private async Task InsertImageDataAsync(string hash, IdolImageDataType type, byte[] data)
        {
            using (var db = new ImasCDDbContext(_ConnectionString))
            {
                db.Database.CommandTimeout = _Timeout;
                var d = await db.IdolImageData.FirstOrDefaultAsync(_ => _.Hash == hash && _.Type == type);

                if (d == null)
                {
                    d      = new IdolImageData();
                    d.Hash = hash;
                    d.Type = type;
                    db.IdolImageData.Add(d);
                }
                d.Data = data;

                await db.SaveChangesAsync();
            }
        }
示例#8
0
        public async Task <JsonIdolImageResult> GetItemsAsync([FromUri] SearchCondition condition = null)
        {
            var c = condition ?? new SearchCondition();

            using (var db = new ImasCDDbContext())
            {
                IQueryable <IdolImage> q = db.IdolImages;
                q = Where(q, _ => _.Hash, c.Hash, TextOperator.Equal);
                q = Where(q, _ => _.Headline, c.Headline, c.HeadlineOperator);
                q = Where(q, _ => _.Idol.Name, c.Name, c.NameOperator);
                q = Where(q, _ => _.Idol.Kana, c.Kana, c.KanaOperator);

                if (c.IsPlus == true || (c.Rarity & IdolRarity.Plus) == IdolRarity.Plus)
                {
                    q = q.Where(_ => (_.Rarity & IdolRarity.Plus) == IdolRarity.Plus);
                }
                else if (c.IsPlus == false)
                {
                    q = q.Where(_ => (_.Rarity & IdolRarity.Plus) != IdolRarity.Plus);
                }

                c.Rarity &= ~IdolRarity.Plus;
                if (c.Rarity != IdolRarity.Unknown)
                {
                    q = q.Where(_ => (_.Rarity & c.Rarity) == c.Rarity);
                }
                if (c.IdolType != IdolType.Unknown)
                {
                    q = q.Where(_ => _.Type == c.IdolType);
                }
                var list = await q.Include(_ => _.Idol).Take(Math.Max(c.Count, 1)).ToListAsync();

                var types = new[]
                {
                    IdolImageDataType.Framed,
                    IdolImageDataType.Frameless,
                    IdolImageDataType.Quest,
                    IdolImageDataType.LS,
                    IdolImageDataType.XS
                };

                var hs = list.Select(_ => _.Hash);
                var ie = await db.IdolImageData.Where(_ => hs.Contains(_.Hash) && types.Contains(_.Type)).ToDictionaryAsync(_ => new { _.Hash, _.Type }, _ => _.Data != null);

                var jl = new List <JsonIdolImage>(list.Count);

                IEnumerable <string> vs;
                Request.Headers.TryGetValues("X-Original-URL", out vs);

                var ou = vs?.Where(_ => _?.Length > 0).FirstOrDefault();

                var ub = new UriBuilder(string.IsNullOrEmpty(ou) ? Request.RequestUri : new Uri(Request.RequestUri, ou));
                ub.Query = null;
                var vpr = RequestContext.VirtualPathRoot;

                if (vpr?.EndsWith("/") == true)
                {
                    vpr = vpr.Substring(0, vpr.Length - 1);
                }

                foreach (var i in list)
                {
                    var j = new JsonIdolImage(i);
                    foreach (var t in types)
                    {
                        bool b;
                        if (!ie.TryGetValue(new { j.Hash, Type = t }, out b) || b)
                        {
                            ub.Path = $"{vpr}/i/{t}/{j.Hash}.jpg";
                            j.SetUrl(t, ub.Uri.ToString());
                        }
                    }
                    jl.Add(j);
                }

                return(new JsonIdolImageResult()
                {
                    Items = jl
                });
            }
        }