Skip to content

Commit

Permalink
Add Media Oembed Support and User Feed min_id Support (#530) by @cory…
Browse files Browse the repository at this point in the history
…shaw1

* Add oembed support

* Add support for user feed min id pagination parameter
  • Loading branch information
coryshaw1 committed Sep 23, 2023
1 parent f38a1c6 commit 47cdd3b
Show file tree
Hide file tree
Showing 10 changed files with 180 additions and 14 deletions.
2 changes: 1 addition & 1 deletion src/InstagramApiSharp/API/InstaApiConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,7 @@ internal static class InstaApiConstants
public const string DYI_REQUEST_DOWNLOAD_DATA = API_SUFFIX + "/dyi/request_download_data/";
public const string DYI_CHECK_DATA_STATE = API_SUFFIX + "/dyi/check_data_state/";
public const string DYNAMIC_ONBOARDING_GET_STEPS = API_SUFFIX + "/dynamic_onboarding/get_steps/";
public const string GET_MEDIAID = API_SUFFIX + "/oembed/?url={0}";
public const string OEMBED = API_SUFFIX + "/oembed/?url={0}";
public const string MEGAPHONE_LOG = API_SUFFIX + "/megaphone/log/";

public const string QE_EXPOSE = API_SUFFIX + "/qe/expose/";
Expand Down
6 changes: 6 additions & 0 deletions src/InstagramApiSharp/API/Processors/IMediaProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -195,5 +195,11 @@ public interface IMediaProcessor
/// <param name="caption">Caption</param>
/// <param name="location">Location => Optional (get it from <seealso cref="ILocationProcessor.SearchLocationAsync"/></param>
Task<IResult<InstaMedia>> UploadVideoAsync(Action<InstaUploaderProgress> progress, InstaVideoUpload video, string caption, InstaLocationShort location = null);

/// <summary>
/// Get media Oembed data from url ("share link")
/// </summary>
/// <param name="uri">Uri to get media Oembed</param>
Task<IResult<InstaOembed>> GetOembedByUrlAsync(Uri uri);
}
}
46 changes: 38 additions & 8 deletions src/InstagramApiSharp/API/Processors/MediaProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -396,16 +396,14 @@ public async Task<IResult<string>> GetMediaIdFromUrlAsync(Uri uri)
{
try
{
var collectionUri = UriCreator.GetMediaIdFromUrlUri(uri);
var request = _httpHelper.GetDefaultRequest(HttpMethod.Get, collectionUri, _deviceInfo);
var response = await _httpRequestProcessor.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();
var oembed = await GetOembedByUrlAsync(uri);

if (response.StatusCode != HttpStatusCode.OK)
return Result.UnExpectedResponse<string>(response, json);
if (oembed.Succeeded)
{
return Result.Success(oembed.Value.MediaId);
}

var data = JsonConvert.DeserializeObject<InstaOembedUrlResponse>(json);
return Result.Success(data.MediaId);
return Result.Fail<string>(oembed.Info.Exception);
}
catch (HttpRequestException httpException)
{
Expand Down Expand Up @@ -1690,5 +1688,37 @@ JObject GetVideoConfigure(string uploadId, InstaVideoUpload video)
}
return vidData;
}

/// <summary>
/// Get media Oembed data from url ("share link")
/// </summary>
/// <param name="uri">Uri to get media Oembed</param>
public async Task<IResult<InstaOembed>> GetOembedByUrlAsync(Uri uri)
{
try
{
var collectionUri = UriCreator.GetMediaOembedFromUrlUri(uri);
var request = _httpHelper.GetDefaultRequest(HttpMethod.Get, collectionUri, _deviceInfo);
var response = await _httpRequestProcessor.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();

if (response.StatusCode != HttpStatusCode.OK)
return Result.UnExpectedResponse<InstaOembed>(response, json);

var oembedResponse = JsonConvert.DeserializeObject<InstaOembedUrlResponse>(json);
var converter = ConvertersFabric.Instance.GetOembedConverter(oembedResponse);
return Result.Success(converter.Convert());
}
catch (HttpRequestException httpException)
{
_logger?.LogException(httpException);
return Result.Fail(httpException, default(InstaOembed), ResponseType.NetworkProblem);
}
catch (Exception exception)
{
_logger?.LogException(exception);
return Result.Fail<InstaOembed>(exception);
}
}
}
}
4 changes: 3 additions & 1 deletion src/InstagramApiSharp/API/Processors/UserProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,7 @@ InstaMediaList Convert(InstaMediaListResponse mediaListResponse)
&& !string.IsNullOrEmpty(paginationParameters.NextMaxId)
&& paginationParameters.PagesLoaded < paginationParameters.MaximumPagesToLoad)
{

paginationParameters.NextMinId = null; // we started at the correct spot, so just continue with max ids
var nextMedia = await GetUserMedia(userId, paginationParameters);
if (!nextMedia.Succeeded)
return Result.Fail(nextMedia.Info, mediaList);
Expand Down Expand Up @@ -1733,6 +1733,8 @@ private async Task<IResult<InstaMediaListResponse>> GetUserMedia(long userId,
try
{
var instaUri = UriCreator.GetUserMediaListUri(userId, paginationParameters.NextMaxId);
if (!string.IsNullOrEmpty(paginationParameters.NextMinId))
instaUri = UriCreator.GetUserMediaListMinIdUri(userId, paginationParameters.NextMinId);
var request = _httpHelper.GetDefaultRequest(HttpMethod.Get, instaUri, _deviceInfo);
var response = await _httpRequestProcessor.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();
Expand Down
35 changes: 35 additions & 0 deletions src/InstagramApiSharp/Classes/Models/Media/InstaOembed.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
namespace InstagramApiSharp.Classes.Models
{
public class InstaOembed
{
public string ProviderUrl { get; set; }

public string MediaId { get; set; }

public string Title { get; set; }

public string AuthorName { get; set; }

public int? Height { get; set; }

public int Width { get; set; }

public float Version { get; set; }

public string AuthorUrl { get; set; }

public long AuthorId { get; set; }

public string Type { get; set; }

public string ProviderName { get; set; }

public string ThumbnailUrl { get; set; }

public int ThumbnailWidth { get; set; }

public int ThumbnailHeight { get; set; }

public string Html { get; set; }
}
}
2 changes: 1 addition & 1 deletion src/InstagramApiSharp/Classes/PaginationParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ private PaginationParameters()
public string RankToken { get; set; } = string.Empty;
public string NextMaxId { get; set; } = string.Empty;
/// <summary>
/// Only works for Comments!
/// Only works for Comments and User Feeds!
/// </summary>
public string NextMinId { get; set; } = string.Empty;
public int MaximumPagesToLoad { get; private set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,49 @@ namespace InstagramApiSharp.Classes.ResponseWrappers
{
public class InstaOembedUrlResponse
{
[JsonProperty("media_id")] //media_id is enough.
[JsonProperty("provider_url")]
public string ProviderUrl { get; set; }

[JsonProperty("media_id")]
public string MediaId { get; set; }

[JsonProperty("title")]
public string Title { get; set; }

[JsonProperty("author_name")]
public string AuthorName { get; set; }

[JsonProperty("height")]
public int? Height { get; set; }

[JsonProperty("width")]
public int Width { get; set; }

[JsonProperty("version")]
public float Version { get; set; }

[JsonProperty("author_url")]
public string AuthorUrl { get; set; }

[JsonProperty("author_id")]
public long AuthorId { get; set; }

[JsonProperty("type")]
public string Type { get; set; }

[JsonProperty("provider_name")]
public string ProviderName { get; set; }

[JsonProperty("thumbnail_url")]
public string ThumbnailUrl { get; set; }

[JsonProperty("thumbnail_width")]
public int ThumbnailWidth { get; set; }

[JsonProperty("thumbnail_height")]
public int ThumbnailHeight { get; set; }

[JsonProperty("html")]
public string Html { get; set; }
}
}
6 changes: 6 additions & 0 deletions src/InstagramApiSharp/Converters/ConvertersFabric.cs
Original file line number Diff line number Diff line change
Expand Up @@ -980,5 +980,11 @@ public IObjectConverter<InstaTopicalExploreFeed, InstaTopicalExploreFeedResponse
{
return new InstaTopicalExploreFeedConverter { SourceObject = response };
}

public IObjectConverter<InstaOembed, InstaOembedUrlResponse> GetOembedConverter(
InstaOembedUrlResponse responseOembed)
{
return new InstaOembedConverter { SourceObject = responseOembed };
}
}
}
36 changes: 36 additions & 0 deletions src/InstagramApiSharp/Converters/Media/InstaOembedConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using InstagramApiSharp.Classes.Models;
using InstagramApiSharp.Classes.ResponseWrappers;

namespace InstagramApiSharp.Converters
{
internal class InstaOembedConverter : IObjectConverter<InstaOembed, InstaOembedUrlResponse>
{

public InstaOembedUrlResponse SourceObject { get; set; }

public InstaOembed Convert()
{
if (SourceObject == null) throw new ArgumentNullException($"Source object");

return new InstaOembed
{
AuthorId = SourceObject.AuthorId,
AuthorName = SourceObject.AuthorName,
AuthorUrl = SourceObject.AuthorUrl,
Height = SourceObject.Height,
Html = SourceObject.Html,
MediaId = SourceObject.MediaId,
ProviderName = SourceObject.ProviderName,
ProviderUrl = SourceObject.ProviderUrl,
ThumbnailHeight = SourceObject.ThumbnailHeight,
ThumbnailUrl = SourceObject.ThumbnailUrl,
ThumbnailWidth = SourceObject.ThumbnailWidth,
Title = SourceObject.Title,
Type = SourceObject.Type,
Version = SourceObject.Version,
Width = SourceObject.Width
};
}
}
}
13 changes: 11 additions & 2 deletions src/InstagramApiSharp/Helpers/UriCreator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1020,9 +1020,9 @@ public static Uri GetMediaUploadFinishUri()
return instaUri;
}

public static Uri GetMediaIdFromUrlUri(Uri uri)
public static Uri GetMediaOembedFromUrlUri(Uri uri)
{
if (!Uri.TryCreate(BaseInstagramUri, string.Format(InstaApiConstants.GET_MEDIAID, uri.AbsoluteUri),
if (!Uri.TryCreate(BaseInstagramUri, string.Format(InstaApiConstants.OEMBED, uri.AbsoluteUri),
out var instaUri))
throw new Exception("Can't create URI for getting media id");
return instaUri;
Expand Down Expand Up @@ -1682,6 +1682,15 @@ public static Uri GetUserMediaListUri(long userPk, string nextId = "")
.AddQueryParameter("count", "9");
}

public static Uri GetUserMediaListMinIdUri(long userPk, string minId = "")
{
if (!Uri.TryCreate(BaseInstagramUri, string.Format(InstaApiConstants.USEREFEED, userPk), out var instaUri))
throw new Exception("Cant create URI for user media retrieval");
return !string.IsNullOrEmpty(minId)
? new UriBuilder(instaUri) { Query = $"min_id={minId}" }.Uri
: instaUri;
}

public static Uri GetArchivedMediaFeedsListUri(string nextId = "")
{
if (!Uri.TryCreate(BaseInstagramUri, InstaApiConstants.FEED_ONLY_ME_FEED, out var instaUri))
Expand Down

0 comments on commit 47cdd3b

Please sign in to comment.