// OpenTween - Client of Twitter
// Copyright (c) 2014 kim_upsilon (@kim_upsilon)
// All rights reserved.
//
// This file is part of OpenTween.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see , or write to
// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
// Boston, MA 02110-1301, USA.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace OpenTween.Api.DataModel
{
// 参照: https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/entities-object
[DataContract]
public class TwitterEntities : IEnumerable
{
[DataMember(Name = "hashtags", IsRequired = false)]
public TwitterEntityHashtag[] Hashtags { get; set; }
[DataMember(Name = "media", IsRequired = false)]
public TwitterEntityMedia[] Media { get; set; }
[DataMember(Name = "symbols", IsRequired = false)]
public TwitterEntitySymbol[] Symbols { get; set; }
[DataMember(Name = "urls", IsRequired = false)]
public TwitterEntityUrl[] Urls { get; set; }
[DataMember(Name = "user_mentions", IsRequired = false)]
public TwitterEntityMention[] UserMentions { get; set; }
public IEnumerator GetEnumerator()
{
var entities = Enumerable.Empty();
if (this.Hashtags != null)
entities = entities.Concat(this.Hashtags);
if (this.Media != null)
entities = entities.Concat(this.Media);
if (this.Symbols != null)
entities = entities.Concat(this.Symbols);
if (this.Urls != null)
entities = entities.Concat(this.Urls);
if (this.UserMentions != null)
entities = entities.Concat(this.UserMentions);
return entities.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
=> this.GetEnumerator();
}
[DataContract]
public abstract class TwitterEntity
{
[DataMember(Name = "indices")]
public int[] Indices { get; set; }
}
[DataContract]
public class TwitterEntityHashtag : TwitterEntity
{
[DataMember(Name = "text")]
public string Text { get; set; }
}
[DataContract]
public class TwitterEntityMedia : TwitterEntityUrl
{
[DataMember(Name = "additional_media_info", IsRequired = false)]
public TwitterMediaAdditionalInfo AdditionalMediaInfo { get; set; }
[DataMember(Name = "id")]
public long Id { get; set; }
[DataMember(Name = "id_str")]
public string IdStr { get; set; }
[DataMember(Name = "media_url_https")]
public string MediaUrlHttps { get; set; }
[DataMember(Name = "sizes")]
public TwitterMediaSizes Sizes { get; set; }
[DataMember(Name = "source_status_id")]
public long SourceStatusId { get; set; }
[DataMember(Name = "source_status_id_str")]
public string SourceStatusIdStr { get; set; }
[DataMember(Name = "type")]
public string Type { get; set; }
[DataMember(Name = "video_info", IsRequired = false)]
public TwitterMediaVideoInfo VideoInfo { get; set; }
[DataMember(Name = "ext_alt_text", IsRequired = false)]
public string AltText { get; set; }
}
[DataContract]
public class TwitterMediaSizes
{
[DataMember(Name = "thumb")]
public TwitterMediaSizes.Size Thumb { get; set; }
[DataMember(Name = "large")]
public TwitterMediaSizes.Size Large { get; set; }
[DataMember(Name = "medium")]
public TwitterMediaSizes.Size Medium { get; set; }
[DataMember(Name = "small")]
public TwitterMediaSizes.Size Small { get; set; }
[DataContract]
public class Size
{
[DataMember(Name = "h")]
public int Height { get; set; }
[DataMember(Name = "resize")]
public string Resize { get; set; }
[DataMember(Name = "w")]
public int Width { get; set; }
}
}
[DataContract]
public class TwitterMediaVideoInfo
{
[DataMember(Name = "aspect_ratio")]
public int[] AspectRatio { get; set; }
[DataMember(Name = "duration_millis", IsRequired = false)]
public long? DurationMillis { get; set; }
[DataMember(Name = "variants")]
public TwitterMediaVideoInfo.Variant[] Variants { get; set; }
[DataContract]
public class Variant
{
[DataMember(Name = "bitrate")]
public int? Bitrate { get; set; }
[DataMember(Name = "content_type")]
public string ContentType { get; set; }
[DataMember(Name = "url")]
public string Url { get; set; }
}
}
[DataContract]
public class TwitterMediaAdditionalInfo
{
[DataMember(Name = "title")]
public string Title { get; set; }
[DataMember(Name = "description")]
public string Description { get; set; }
[DataMember(Name = "embeddable")]
public bool Embeddable { get; set; }
[DataMember(Name = "monetizable")]
public bool Monetizable { get; set; }
}
[DataContract]
public class TwitterEntitySymbol : TwitterEntity
{
[DataMember(Name = "text")]
public string Text { get; set; }
}
[DataContract]
public class TwitterEntityUrl : TwitterEntity
{
[DataMember(Name = "display_url")]
public string DisplayUrl { get; set; }
[DataMember(Name = "expanded_url")]
public string ExpandedUrl { get; set; }
[DataMember(Name = "url")]
public string Url { get; set; }
}
[DataContract]
public class TwitterEntityMention : TwitterEntity
{
[DataMember(Name = "id")]
public long Id { get; set; }
[DataMember(Name = "id_str")]
public string IdStr { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "screen_name")]
public string ScreenName { get; set; }
}
public class TwitterEntityEmoji : TwitterEntity
{
public string Text { get; set; }
public string Url { get; set; }
}
}