{"id":22705746,"url":"https://github.com/hey-red/oembed","last_synced_at":"2025-04-13T11:12:06.100Z","repository":{"id":65504689,"uuid":"470940846","full_name":"hey-red/OEmbed","owner":"hey-red","description":"Simple oEmbed consumer library for .NET","archived":false,"fork":false,"pushed_at":"2024-12-22T14:09:27.000Z","size":181,"stargazers_count":6,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-13T11:12:01.386Z","etag":null,"topics":["csharp","dotnet","oembed"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hey-red.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-03-17T10:10:41.000Z","updated_at":"2025-03-13T14:29:13.000Z","dependencies_parsed_at":"2024-04-12T05:13:19.632Z","dependency_job_id":null,"html_url":"https://github.com/hey-red/OEmbed","commit_stats":{"total_commits":155,"total_committers":2,"mean_commits":77.5,"dds":0.006451612903225823,"last_synced_commit":"19b7ee546304ee9907807c9a7b4d42029d73f22a"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hey-red%2FOEmbed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hey-red%2FOEmbed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hey-red%2FOEmbed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hey-red%2FOEmbed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hey-red","download_url":"https://codeload.github.com/hey-red/OEmbed/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248703198,"owners_count":21148118,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","dotnet","oembed"],"created_at":"2024-12-10T09:12:47.502Z","updated_at":"2025-04-13T11:12:06.079Z","avatar_url":"https://github.com/hey-red.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OEmbed\n\nA simple [oEmbed](https://oembed.com) consumer library for .NET\n\n## Install\nvia [NuGet](https://www.nuget.org/packages/OEmbed):\n```\nPM\u003e Install-Package OEmbed\n```\n\n[DI extensions](https://www.nuget.org/packages/OEmbed.Extensions.Microsoft.DependencyInjection/) for Microsoft.Extensions.DependencyInjection:\n```\nPM\u003e Install-Package OEmbed.Extensions.Microsoft.DependencyInjection\n```\n\n## DI configuration\n\n```C#\nservices.AddOEmbed();\n\n// or\n\nservices.AddOEmbed(options =\u003e\n{\n    options.EnableCache = true; // true by default\n});\n```\n\nBy default it's register all providers listed below:\n\n* CoubProvider\n* DeviantartProvider\n* FlickrProvider\n* GiphyProvider\n* GyazoProvider\n* ImgurProvider\n* KickstarterProvider\n* PinterestProvider\n* PixivProvider\n* RedditProvider\n* SoundcloudProvider\n* SpotifyProvider\n* TiktokProvider\n* TumblrProvider\n* TwitterProvider\n* VimeoProvider\n* YoutubeProvider\n\nAdditional providers can be added during configuration:\n\n```C#\nusing HeyRed.OEmbed.Providers;\n\nservices.AddOEmbed()\n    .ClearProviders() // remove all default providers\n    .AddProvider\u003cYoutubeProvider\u003e()\n    .AddProvider\u003cVimeoProvider\u003e()\n    .Addprovider\u003cImgurProvider\u003e();\n\n// or with options\n// NOTE: Some oembed providers defines additional parameters, so use \"Parameters\" option if you need them.\nservices.AddOEmbed()\n    .ClearProviders() // remove all default providers\n    .AddProvider\u003cTwitterProvider\u003e(options =\u003e\n    {\n        options.Parameters = new Dictionary\u003cstring, string?\u003e\n        {\n            [\"theme\"] = \"dark\"\n        };\n    })\n    .AddProvider\u003cFacebookProvider\u003e(options =\u003e\n    {\n        options.Parameters = new Dictionary\u003cstring, string?\u003e\n        {\n            [\"access_token\"] = \"app_id|token\"\n        };\n    });\n```\n\nAdditional providers:\n\n* FacebookProvider\n* InstagramProvider\n* AfreecatvProvider\n* AnnieMusicProvider\n* AudioboomProvider\n* AudiomackProvider\n* CodepenProvider\n* YandexMusicProvider\n* DeezerProvider\n* DailymotionProvider\n* RutubeProvider\n\n## Usage\n\n* Inject `IOEmbedConsumer` throught constructor injection.\n* Call one of RequestAsync() overloads.\n\nFor example:\n```C#\nusing HeyRed.OEmbed.Abstractions;\nusing HeyRed.OEmbed.Models;\n\n// Returns null if provider not found or HttpRequestException was thrown.\nVideo? result = await _oEmbedConsumer.RequestAsync\u003cVideo\u003e(\"https://vimeo.com/22439234\");\n```\nThe result object is are similar to described [in the spec](https://oembed.com/#:~:text=2.3.4,parameters)\n\nModels:\n[Base](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Models/Base.cs), [Link](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Models/Link.cs), [Photo](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Models/Photo.cs), [Rich](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Models/Rich.cs), [Video](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Models/Video.cs)\n\nBasic request:\n```C#\n// Deserialize response based on provider preferences\nvar item = await _oEmbedConsumer.RequestAsync(url);\n\nif (item is not null)\n{\n    if (item is Video) \n    {\n        // work with video \n    }\n    else if (item is Photo) \n    {\n        // work with photo\n    }\n    else { //do something }\n}\n```\n\n## Caching\n\nConfigure cache options:\n\n```C#\nservices.AddOEmbed().Configure\u003cCacheOptions\u003e(options =\u003e\n{\n    options.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(30); // Default is 1 hour\n});\n```\n\nBy default cache is enabled and it's default implementation is just a wrapper around [MemoryCache](https://docs.microsoft.com/en-us/dotnet/api/system.runtime.caching.memorycache)\n\nYou can write your own implementation of [ICache](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Abstractions/ICache.cs) and replace default cache during app configuration:\n```C#\nservices.AddOEmbed().SetCache\u003cDistributedRedisCache\u003e();\n```\n\n## Additional providers\n\nAn easy way to write your own provider is inheritance of [ProviderBase](https://github.com/hey-red/OEmbed/blob/master/OEmbed/Providers/Common/ProviderBase.cs) record:\n\n```C#\npublic record ExampleProvider : ProviderBase\n{\n    // \"ProviderOptions\" is optional, you can safely remove argument from constructor\n    public ExampleProvider(ProviderOptions? options = default)\n    {\n        AddParameters(options?.Parameters);\n        \n        // The Provider registry is primarily using this to select right provider at first check.\n        // NOTE: Add all the hosts that will be used in the schemes below.\n        AddAllowedHosts(new[] { \"example.com\", \"www.example.com\" });\n        \n        AddScheme(\n            // Simple regex without hostname, \"^\" and \"$\" asserts. \n            // If this Regex is match string url, then scheme used to build request.\n            matcher: new RegexMatcher(@\"/\\S+\"),\n            \n            // API endpoint for current scheme\n            apiEndpoint: \"http://example.com/oembed\",\n            \n            // The response type provided by resource.\n            resourceType: ResourceType.Rich);\n        }\n    }\n    \n    // (Optional) Primary API response format(default is JSON)\n    public override ResponseFormat ResponseType =\u003e ResponseFormat.Xml;\n}\n```\n\n## License\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhey-red%2Foembed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhey-red%2Foembed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhey-red%2Foembed/lists"}