Skip to content

Commit

Permalink
Merge pull request #58 from lutsenkirill/media_variants_support
Browse files Browse the repository at this point in the history
Media variants support
  • Loading branch information
marcogruhl committed Aug 15, 2023
2 parents 029d684 + 6f19ea8 commit 6985407
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 2 deletions.
19 changes: 18 additions & 1 deletion src/JsonOption/MediaConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,29 @@ public override Media Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSe
Width = TryGetProperty(elem, "width")?.GetInt32(),
DurationMs = TryGetProperty(elem, "duration_ms")?.GetInt32(),
PreviewImageUrl = TryGetProperty(elem, "preview_image_url")?.GetString(),
Url = TryGetProperty(elem, "url")?.GetString()
Url = TryGetProperty(elem, "url")?.GetString(),
Variants = GetMediaVariants(elem)
};

return media;
}
}

private MediaVariant[] GetMediaVariants(JsonElement mediaElement)
{
var mediaVariants = Array.Empty<MediaVariant>();

if(mediaElement.TryGetProperty("variants", out var variants))
{
mediaVariants = JsonSerializer.Deserialize<MediaVariant[]>(variants.GetRawText(), new JsonSerializerOptions
{
PropertyNamingPolicy = new SnakeCaseNamingPolicy()
});
}

return mediaVariants;
}

public override void Write(Utf8JsonWriter writer, Media value, JsonSerializerOptions options)
{
throw new NotImplementedException();
Expand Down
8 changes: 7 additions & 1 deletion src/Request/AdvancedSearch/MediaOption.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ public enum MediaOption
/// <summary>
/// URL to the image of the content
/// </summary>
Url
Url,

/// <summary>
/// Each media object may have multiple display or playback variants, with different resolutions or formats.
/// For videos, each variant will also contain URLs to the video in each format.
/// </summary>
Variants
}
}
1 change: 1 addition & 0 deletions src/Response/RMedia/Media.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ public class Media
public int? DurationMs { init; get; }
public string PreviewImageUrl { init; get; }
public string Url { init; get; }
public MediaVariant[] Variants { init; get; }
}
}
9 changes: 9 additions & 0 deletions src/Response/RMedia/MediaVariant.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace TwitterSharp.Response.RMedia
{
public class MediaVariant
{
public int? BitRate { init; get; }
public string ContentType { init; get; }
public string Url { init; get; }
}
}
27 changes: 27 additions & 0 deletions test/TestMedia.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Linq;
using System.Threading.Tasks;
using TwitterSharp.Client;
using TwitterSharp.Request.AdvancedSearch;
Expand Down Expand Up @@ -78,5 +79,31 @@ public async Task GetTweetWithMediaPreview()
Assert.IsNotNull(a.Attachments.Media[0].PreviewImageUrl);
Assert.AreEqual("https://pbs.twimg.com/ext_tw_video_thumb/1237543944570847233/pu/img/kRBUlSd7M7ju_QK1.jpg", a.Attachments.Media[0].PreviewImageUrl);
}

[TestMethod]
public async Task GetTweetWithVideoMediaVariants()
{
var client = new TwitterClient(Environment.GetEnvironmentVariable("TWITTER_TOKEN"));
var answer = await client.GetTweetsAsync(new[] { "1688848776612691968" }, new TweetSearchOptions
{
TweetOptions = new[] { TweetOption.Attachments },
MediaOptions = new [] { MediaOption.Variants }
});
Assert.IsTrue(answer.Length == 1);
var a = answer[0];
Assert.IsNotNull(a.Attachments);
Assert.IsNotNull(a.Attachments.Media);
Assert.AreEqual(1, a.Attachments.Media.Length);
Assert.AreEqual("13_1688840150338428928", a.Attachments.Media[0].Key);
Assert.IsNotNull(a.Attachments.Media[0].Type);
Assert.AreEqual(MediaType.Video, a.Attachments.Media[0].Type);
Assert.IsNull(a.Attachments.Media[0].PreviewImageUrl);

Assert.IsNotNull(a.Attachments.Media[0].Variants);
Assert.IsTrue(a.Attachments.Media[0].Variants.Length > 0);
Assert.IsTrue(a.Attachments.Media[0].Variants.Any(v => v.ContentType == "video/mp4"));
Assert.IsTrue(a.Attachments.Media[0].Variants.Any(v => v.BitRate.HasValue));
Assert.IsTrue(a.Attachments.Media[0].Variants.All(v => string.IsNullOrWhiteSpace(v.Url) == false));
}
}
}

0 comments on commit 6985407

Please sign in to comment.