{"id":269398,"date":"2025-01-23T01:00:59","date_gmt":"2025-01-23T01:00:59","guid":{"rendered":"https:\/\/michigandigitalnews.com\/index.php\/2025\/01\/23\/media3-1-5-0-whats-new\/"},"modified":"2025-06-25T17:09:37","modified_gmt":"2025-06-25T17:09:37","slug":"media3-1-5-0-whats-new","status":"publish","type":"post","link":"https:\/\/michigandigitalnews.com\/index.php\/2025\/01\/23\/media3-1-5-0-whats-new\/","title":{"rendered":"Media3 1.5.0 \u2014 what\u2019s new?"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div>\n<meta content=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi3xfaeSVwhItxPTRdI2vEUu6t8ZSJWKMYB6xWkb9inI8ab1GltWuCExl29Z8SAQ1Fo2A4moEQLykBdkjIZ_IqikrD-QrmkwWKCOaKALh5fMiV5SRRUM7JRmjavEZ64horigEBxNK5RtW_NI88_LjbqTa69Os3a-ADQbrNp7R5e78dXmkc7rsYyx3cRYdo\/s1600\/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Card%20%281%29.png\" name=\"twitter:image\"\/><br \/>\n<img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEi3xfaeSVwhItxPTRdI2vEUu6t8ZSJWKMYB6xWkb9inI8ab1GltWuCExl29Z8SAQ1Fo2A4moEQLykBdkjIZ_IqikrD-QrmkwWKCOaKALh5fMiV5SRRUM7JRmjavEZ64horigEBxNK5RtW_NI88_LjbqTa69Os3a-ADQbrNp7R5e78dXmkc7rsYyx3cRYdo\/s1600\/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Card%20%281%29.png\" style=\"display: none;\"\/><\/p>\n<p><em>Posted by Kristina Simakova \u2013 Engineering Manager<\/em><\/p>\n<p><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh1PmhSCIphw3wGW7dJ9Yr7LLgG_6rqNwklO04UO6iZAsh6HjosgOn_SovJ8sEJvNYdeU08nMgnHQ3_L8F3pNU0Z72viRxqg8Ir0ceP-XVx45lkfImCbLnKywl7lho5CWJt0hBqt5dehuzLLpkrmkHdpTXRCzokmV4m3lswrsxAHWRHCstygUnK5PKCrO4\/s1600\/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Banner.png\"><img decoding=\"async\" border=\"0\" data-original-height=\"800\" data-original-width=\"100%\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh1PmhSCIphw3wGW7dJ9Yr7LLgG_6rqNwklO04UO6iZAsh6HjosgOn_SovJ8sEJvNYdeU08nMgnHQ3_L8F3pNU0Z72viRxqg8Ir0ceP-XVx45lkfImCbLnKywl7lho5CWJt0hBqt5dehuzLLpkrmkHdpTXRCzokmV4m3lswrsxAHWRHCstygUnK5PKCrO4\/s1600\/AndroidSpotlight_Camera&amp;Media_Blog_Media3%201.5.0_Banner.png\"\/><\/a><\/p>\n<p><em>This article is cross-published on <a href=\"https:\/\/kristisimakova.medium.com\/be62bdb53af8\" target=\"_blank\" rel=\"noopener\">Medium<\/a><\/em><\/p>\n<p>Transformer now supports motion photos and faster image encoding. We\u2019ve also simplified the setup for <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager<\/span> and <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer<\/span>, making it easier to use. But that\u2019s not all! We\u2019ve included a new IAMF decoder, a Kotlin listener extension, and easier Player optimization through delegation.<\/p>\n<p>To learn more about all new APIs and bug fixes, check out the <a href=\"https:\/\/github.com\/androidx\/media\/releases\/tag\/1.5.0\" target=\"_blank\" rel=\"noopener\">full release notes<\/a>.<\/p>\n<h2><span style=\"font-size: x-large;\">Transformer improvements<\/span><\/h2>\n<h3><span style=\"font-size: large;\">Motion photo support<\/span><\/h3>\n<p><span style=\"color:#0D904F; font-family:Courier;\">Transformer<\/span> now supports exporting motion photos. The motion photo\u2019s image is exported if the corresponding <span style=\"color:#0D904F; font-family:Courier;\">MediaItem<\/span>\u2019s image duration is set (see <span style=\"color:#0D904F; font-family:Courier;\">MediaItem.Builder().setImageDurationMs()<\/span>) Otherwise, the motion photo\u2019s video is exported. Note that the <span style=\"color:#0D904F; font-family:Courier;\">EditedMediaItem<\/span>\u2019s duration should not be set in either case as it will automatically be set to the corresponding MediaItem\u2019s image duration.<\/p>\n<h3><span style=\"font-size: large;\">Faster image encoding<\/span><\/h3>\n<p>This release accelerates image-to-video encoding, thanks to optimizations in <span style=\"color:#0D904F; font-family:Courier;\">DefaultVideoFrameProcessor.queueInputBitmap()<\/span>. <span style=\"color:#0D904F; font-family:Courier;\">DefaultVideoFrameProcessor<\/span> now treats the Bitmap given to <span style=\"color:#0D904F; font-family:Courier;\">queueInputBitmap()<\/span> as immutable. The GL pipeline will resample and color-convert the input Bitmap only once. As a result, Transformer operations that take large (e.g. 12 megapixels) images as input execute faster.<\/p>\n<h3><span style=\"font-size: large;\">AudioEncoderSettings<\/span><\/h3>\n<p>Similar to <span style=\"font-family:Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/androidx\/media3\/transformer\/VideoEncoderSettings\" target=\"_blank\" rel=\"noopener\">VideoEncoderSettings<\/a><\/span>, Transformer now supports <span style=\"color:#0D904F; font-family:Courier;\">AudioEncoderSettings<\/span> which can be used to set the desired encoding profile and bitrate.<\/p>\n<h3><span style=\"font-size: large;\">Edit list support<\/span><\/h3>\n<p><span style=\"color:#0D904F; font-family:Courier;\">Transformer<\/span> now shifts the first video frame to start from 0. This fixes A\/V sync issues in some files where an edit list is present.<\/p>\n<h3><span style=\"font-size: large;\">Unsupported track type logging<\/span><\/h3>\n<p>This release includes improved logging for unsupported track types, providing more detailed information for troubleshooting and debugging.<\/p>\n<h2><span style=\"font-size: x-large;\">Media3 muxer<\/span><\/h2>\n<p>In one of the previous releases we added a new <a href=\"https:\/\/github.com\/androidx\/media\/tree\/release\/libraries\/muxer\" target=\"_blank\" rel=\"noopener\">muxer library<\/a> which can be used to create MP4 container files. The media3 muxer offers support for a wide range of <a href=\"https:\/\/developer.android.com\/reference\/androidx\/media3\/muxer\/Mp4Muxer#:~:text=Muxer%20supports%20muxing%20of%3A\" target=\"_blank\" rel=\"noopener\">audio and video codecs<\/a>, enabling seamless handling of diverse media formats. This new library also brings advanced features including:<\/p>\n<p>The muxer library can be included as a gradle dependency:<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\">implementation (<span style=\"color: #BA2121\">\"androidx.media3:media3-muxer:1.5.0\"<\/span>)\n<\/pre>\n<\/div>\n<h3><span style=\"font-size: large;\">Media3 muxer with Transformer<\/span><\/h3>\n<p>To use the media3 muxer with Transformer, set an InAppMuxer.Factory (which internally wraps media3 muxer) as the muxer factory when creating a Transformer:<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #008000; font-weight: bold\">val<\/span> transformer = Transformer.Builder(context)\n    .setMuxerFactory(InAppMuxer.Factory.Builder().build())\n    .build()\n<\/pre>\n<\/div>\n<h2><span style=\"font-size: x-large;\">Simpler setup for <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager<\/span> and <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer<\/span><\/span><\/h2>\n<p>With Media3 1.5.0, we added <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager.Builder<\/span>, which makes it much easier to build the preload components and the player. Previously we asked you to instantiate several required components (<span style=\"color:#0D904F; font-family:Courier;\">RenderersFactory<\/span>, <span style=\"color:#0D904F; font-family:Courier;\">TrackSelectorFactory<\/span>, <span style=\"color:#0D904F; font-family:Courier;\">LoadControl<\/span>, <span style=\"color:#0D904F; font-family:Courier;\">BandwidthMeter<\/span> and preload \/ playback <span style=\"color:#0D904F; font-family:Courier;\">Looper<\/span>) first, and be super cautious on correctly sharing those components when injecting them into the <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager<\/span> constructor and the <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer.Builder<\/span>. With the new <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager.Builder<\/span> this becomes a lot simpler:<\/p>\n<ul>\n<ul>\n<li>Build a <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager<\/span> and <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer<\/span> instances with all default components.<\/li>\n<\/ul>\n<\/ul>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #008000; font-weight: bold\">val<\/span> preloadManagerBuilder = DefaultPreloadManager.Builder()\n<span style=\"color: #008000; font-weight: bold\">val<\/span> preloadManager = preloadManagerBuilder.build()\n<span style=\"color: #008000; font-weight: bold\">val<\/span> player = preloadManagerBuilder.buildExoPlayer()\n<\/pre>\n<\/div>\n<p><\/p>\n<ul>\n<ul>\n<li>Build a <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager<\/span> and <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer<\/span> instances with custom sharing components.<\/li>\n<\/ul>\n<\/ul>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #008000; font-weight: bold\">val<\/span> preloadManagerBuilder = DefaultPreloadManager.Builder().setRenderersFactory(customRenderersFactory)\n<span style=\"color: #408080; font-style: italic\">\/\/ The resulting preloadManager uses customRenderersFactory<\/span>\n<span style=\"color: #008000; font-weight: bold\">val<\/span> preloadManager = preloadManagerBuilder.build()\n<span style=\"color: #408080; font-style: italic\">\/\/ The resulting player uses customRenderersFactory<\/span>\n<span style=\"color: #008000; font-weight: bold\">val<\/span> player = preloadManagerBuilder.buildExoPlayer()\n<\/pre>\n<\/div>\n<p><\/p>\n<ul>\n<ul>\n<li>Build a <span style=\"color:#0D904F; font-family:Courier;\">DefaultPreloadManager<\/span> and <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer<\/span> instances, while setting the custom playback-only configurations on the ExoPlayers.<\/li>\n<\/ul>\n<\/ul>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #008000; font-weight: bold\">val<\/span> preloadManagerBuilder = DefaultPreloadManager.Builder()\n<span style=\"color: #008000; font-weight: bold\">val<\/span> preloadManager = preloadManagerBuilder.build()\n<span style=\"color: #408080; font-style: italic\">\/\/ Tune the playback-only configurations<\/span>\n<span style=\"color: #008000; font-weight: bold\">val<\/span> playerBuilder = ExoPlayer.Builder().setFooEnabled()\n<span style=\"color: #408080; font-style: italic\">\/\/ The resulting player will have playback feature \"Foo\" enabled<\/span>\n<span style=\"color: #008000; font-weight: bold\">val<\/span> player = preloadManagerBuilder.buildExoPlayer(playerBuilder)\n<\/pre>\n<\/div>\n<p><\/p>\n<h2><span style=\"font-size: x-large;\">Preloading the next playlist item<\/span><\/h2>\n<p>We\u2019ve added the ability to preload the next item in the playlist of <span style=\"color:#0D904F; font-family:Courier;\">ExoPlayer<\/span>. By default, playlist preloading is disabled but can be enabled by setting the duration which should be preloaded to memory:<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\">player.preloadConfiguration =\n    PreloadConfiguration(<span style=\"color: #408080; font-style: italic\">\/* targetPreloadDurationUs= *\/<\/span> <span style=\"color: #666666\">5<\/span>_000_000L)\n<\/pre>\n<\/div>\n<p>With the <span style=\"color:#0D904F; font-family:Courier;\">PreloadConfiguration<\/span> above, the player tries to preload five seconds of media for the next item in the playlist. Preloading is only started when no media is being loaded that is required for the ongoing playback. This way preloading doesn\u2019t compete for bandwidth with the primary playback.<\/p>\n<p>When enabled, preloading can help minimize join latency when a user skips to the next item before the playback buffer reaches the next item. The first period of the next window is prepared and video, audio and text samples are preloaded into its sample queues. The preloaded period is later queued into the player with preloaded samples immediately available and ready to be fed to the codec for rendering.<\/p>\n<p>Once opted-in, playlist preloading can be turned off again by using <span style=\"color:#0D904F; font-family:Courier;\">PreloadConfiguration.DEFAULT<\/span> to disable playlist preloading:<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\">player.preloadConfiguration = PreloadConfiguration.DEFAULT\n<\/pre>\n<\/div>\n<h2><span style=\"font-size: x-large;\">New IAMF decoder and Kotlin listener extension<\/span><\/h2>\n<p>The 1.5.0 release includes a new <span style=\"color:#0D904F; font-family:Courier;\">media3-decoder-iamf<\/span> module, which allows playback of <a href=\"https:\/\/aomediacodec.github.io\/iamf\/\" target=\"_blank\" rel=\"noopener\">IAMF<\/a> immersive audio tracks in MP4 files. Apps wanting to try this out will need to build the <span style=\"color:#0D904F; font-family:Courier;\">libiamf<\/span> decoder locally. See the <a href=\"https:\/\/github.com\/androidx\/media\/blob\/release\/libraries\/decoder_iamf\/README.md\" target=\"_blank\" rel=\"noopener\">media3 README<\/a> for full instructions.<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\">implementation (<span style=\"color: #BA2121\">\"androidx.media3:media3-decoder-iamf:1.5.0\"<\/span>)\n<\/pre>\n<\/div>\n<p>This release also includes a new <span style=\"color:#0D904F; font-family:Courier;\">media3-common-ktx<\/span> module, a home for Kotlin-specific functionality. The first version of this module contains a suspend function that lets the caller listen to <span style=\"color:#0D904F; font-family:Courier;\">Player.Listener.onEvents<\/span>. This is a building block that\u2019s used by the upcoming <span style=\"color:#0D904F; font-family:Courier;\">media3-ui-compose<\/span> module (launching with media3 1.6.0) to power a Jetpack Compose playback UI.<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\">implementation (<span style=\"color: #BA2121\">\"androidx.media3:media3-common-ktx:1.5.0\"<\/span>)\n<\/pre>\n<\/div>\n<h2><span style=\"font-size: x-large;\">Easier Player customization via delegation<\/span><\/h2>\n<p>Media3 has provided a <span style=\"color:#0D904F; font-family:Courier;\">ForwardingPlayer<\/span> implementation since version 1.0.0, and we have previously suggested that apps should use it when they want to customize the way certain <span style=\"color:#0D904F; font-family:Courier;\">Player<\/span> operations work, by using the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Decorator_pattern\" target=\"_blank\" rel=\"noopener\">decorator pattern<\/a>. One very common use-case is to allow or disallow certain player commands (in order to show\/hide certain buttons in a UI). Unfortunately, doing this correctly with <span style=\"color:#0D904F; font-family:Courier;\">ForwardingPlayer<\/span> is surprisingly hard and error-prone, because you have to consistently override multiple methods, and handle the listener as well. The example code to demonstrate how fiddly this is too long for this blog, so we\u2019ve <a href=\"https:\/\/gist.github.com\/icbaker\/44e962c6e218ad141880331300308021\" target=\"_blank\" rel=\"noopener\">put it in a gist instead<\/a>.<\/p>\n<p>In order to make these sorts of customizations easier, 1.5.0 includes a new <span style=\"color:#0D904F; font-family:Courier;\">ForwardingSimpleBasePlayer<\/span>, which builds on the consistency guarantees provided by <span style=\"color:#0D904F; font-family:Courier;\">SimpleBasePlayer<\/span> to make it easier to create consistent Player implementations following the decorator pattern. The same command-modifying <span style=\"color:#0D904F; font-family:Courier;\">Player<\/span> is now much simpler to implement:<\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:0;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #008000; font-weight: bold\">class<\/span> <span style=\"color: #0000FF\">PlayerWithoutSeekToNext<\/span>(player: Player) : ForwardingSimpleBasePlayer(player) {\n  <span style=\"color: #008000; font-weight: bold\">override<\/span> <span style=\"color: #008000; font-weight: bold\">fun<\/span> <span style=\"color: #0000FF\">getState<\/span>(): State {\n    <span style=\"color: #008000; font-weight: bold\">val<\/span> state = super.getState()\n    <span style=\"color: #008000; font-weight: bold\">return<\/span> state\n      .buildUpon()\n      .setAvailableCommands(\n        state.availableCommands.buildUpon().remove(COMMAND_SEEK_TO_NEXT).build()\n      )\n      .build()\n  }\n\n  <span style=\"color: #408080; font-style: italic\">\/\/ We don't need to override handleSeek, because it is guaranteed not to be called for<\/span>\n  <span style=\"color: #408080; font-style: italic\">\/\/ COMMAND_SEEK_TO_NEXT since we've marked that command unavailable.<\/span>\n}\n<\/pre>\n<\/div>\n<h2><span style=\"font-size: x-large;\">MediaSession: Command button for media items<\/span><\/h2>\n<p>Command buttons for media items allow a session app to declare commands supported by certain media items that then can be conveniently displayed and executed by a MediaController or MediaBrowser:<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"image of command buttons for media items in the Media Center of android Automotive OS\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhvcpjGSGLxJesnow8WTYVgRCE8sNHooJlP7uZIGoS5zZUPtWVjcTNnZ_tcS3kTxQEV39g0Qe3CjURL8H_YFa6Nj_2IctHhvecO00iEudcsrvQYKVnXRFUCAvzBgLc7eBbEDue2Zzvsn029tYhzdUc1iSTf_uzx5ZAhYUbPiUpO3P1LZKPXydABxkBtfvk\/s1600\/Command%20buttons%20for%20media%20items%20in%20the%20Media%20Center%20of%20Android%20Automotive%20OS.webp\" width=\"640\"\/><\/div>\n<p><imgcaption><center><em>Screenshot: Command buttons for media items in the Media Center of Android Automotive OS.<\/em><\/center><\/imgcaption><\/image><\/p>\n<p>You&#8217;ll find the detailed documentation on <a href=\"https:\/\/developer.android.com\/media\/media3\/session\/serve-content#command-buttons-for-media-items\" target=\"_blank\" rel=\"noopener\">android.developer.com<\/a>.<\/p>\n<p>This is the Media3 equivalent of the legacy \u201ccustom browse actions\u201d API, with which Media3 is fully interoperable. Unlike the legacy API, command buttons for media items do not require a <span style=\"color:#0D904F; font-family:Courier;\">MediaLibraryService<\/span> but are a feature of the Media3 <span style=\"color:#0D904F; font-family:Courier;\">MediaSession<\/span> instead. Hence they are available for <span style=\"color:#0D904F; font-family:Courier;\">MediaController<\/span> and <span style=\"color:#0D904F; font-family:Courier;\">MediaBrowser<\/span> in the same way.<\/p>\n<p>If you encounter any issues, have feature requests, or want to share feedback, please let us know using the <a href=\"https:\/\/github.com\/androidx\/media\/issues\" target=\"_blank\" rel=\"noopener\">Media3 issue tracker on GitHub<\/a>. We look forward to hearing from you!<\/p>\n<p><\/p>\n<p><em><\/p>\n<p>This blog post is a part of Camera and Media Spotlight Week. We&#8217;re providing resources \u2013 blog posts, videos, sample code, and more \u2013 all designed to help you uplevel the media experiences in your app.<\/p>\n<p>To learn more about what Spotlight Week has to offer and how it can benefit you, be sure to <a href=\"https:\/\/android-developers.googleblog.com\/2025\/01\/spotlight-week-android-camera-and-media.html\" target=\"_blank\" rel=\"noopener\">read our overview blog post<\/a>.<\/p>\n<p><\/em>\n<\/div>\n<p>[ad_2]<br \/>\n<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2025\/01\/media3-150-whats-new.html\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] Posted by Kristina Simakova \u2013 Engineering Manager This article is cross-published on Medium Transformer now supports motion photos and faster image encoding. We\u2019ve also<\/p>\n","protected":false},"author":1,"featured_media":269399,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[146],"tags":[],"_links":{"self":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/269398"}],"collection":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/comments?post=269398"}],"version-history":[{"count":0,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/269398\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media\/269399"}],"wp:attachment":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media?parent=269398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/categories?post=269398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/tags?post=269398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}