{"id":61101,"date":"2024-04-16T12:56:21","date_gmt":"2024-04-16T07:26:21","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=61101"},"modified":"2024-04-16T12:56:21","modified_gmt":"2024-04-16T07:26:21","slug":"how-do-you-develop-roku-apps-using-the-stack-methodology","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/how-do-you-develop-roku-apps-using-the-stack-methodology\/","title":{"rendered":"How do you develop Roku Apps using the Stack Methodology?"},"content":{"rendered":"<p><b>Table of Contents<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">What is Roku?<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">What is Stack Methodology?<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Advantages<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Disadvantages<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Stack Implementation<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Stack utilization<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Sample Channel discussion and execution<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">References<\/span><\/li>\n<\/ul>\n<p><b>What is Roku?\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Roku is a brand and platform known for its streaming media players and smart TVs. It was developed by Roku, Inc., an American company founded in 2002. Roku devices are designed to provide easy access to a wide range of streaming content, including movies, TV shows, music, and more, via various streaming services and apps.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Roku devices typically connect to your television and provide a user-friendly interface that allows you to browse different streaming services. Users can choose and install apps for services like Netflix, Hulu, Amazon Prime Video, Disney+, and many others, depending on their geographic location and availability. Roku devices also often include features like voice search, customizable home screens, and the ability to cast content from mobile devices to the TV.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In addition to its hardware products, Roku has developed the Roku Channel, a free, ad-supported streaming service that offers a selection of movies, TV shows, and other content.<\/span><\/p>\n<h2><b>What is Stack &amp; Stack Methodology?<\/b><\/h2>\n<p><b>Stack<\/b><\/p>\n<p><span style=\"font-weight: 400;\">A basic linear data structure, the stack is employed for data storage, adhering to the Last In First Out (LIFO) principle, wherein the last-inserted element is the first to be removed. To illustrate, envision a stack of plates where the latest plate placed is on top; when removing a plate, the one at the top is taken first. Implementation is feasible through arrays or linked lists. Key operations include push(), pop(), top(), isEmpty(), size(), and more.<\/span><\/p>\n<h2><b>Stack Methodology<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">The approach in which nodes are upheld in a stack is called Stack Methodology. <\/span><span style=\"font-weight: 400;\">In Roku, we append all children in a group and maintain a nodes stack to play around it.<\/span><\/p>\n<h3><b>Advantages of Stack Methodology<\/b><\/h3>\n<p><b>Eliminate code duplicity:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Stack methodology eliminates the code duplicity that happens for node display and close operations.<\/span><\/p>\n<p><b>Easy implementation:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Implementing the stack data structure is straightforward with arrays or linked lists, and its operations are easy to comprehend and execute.<\/span><\/p>\n<p><b>Efficient memory utilization:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The stack employs a contiguous memory block, enhancing its memory utilization efficiency compared to other data structures.<\/span><\/p>\n<p><b>Fast access time:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The stack data structure facilitates swift access time for adding and removing elements, as these operations occur at the top of the stack.<\/span><\/p>\n<p><b>Supports backtracking:<\/b><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The stack data structure is conducive to supporting backtracking algorithms employed in problem-solving. These algorithms explore all possible solutions by preserving previous states.<\/span><\/p>\n<p><b>Helps in function calls:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Stack data structure is used to store function calls and their states, which helps in the efficient implementation of recursive function calls.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><b>Disadvantage of Stack Methodology<\/b><\/h3>\n<p><b>Limited capacity:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The stack data structure is constrained by a fixed capacity, capable of holding only a predetermined number of elements. When the stack reaches its full capacity, attempting to add new elements may trigger a stack overflow, potentially resulting in data loss.<\/span><\/p>\n<p><b>No random access:<\/b><b>\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The stack data structure does not support random access to its elements; rather, it exclusively permits the addition and removal of elements from the top of the stack. Accessing an element in the middle necessitates the removal of all the elements above it in the stack.<\/span><\/p>\n<p><b>Memory management:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The stack data structure relies on a contiguous block of memory, and frequent addition and removal of elements can lead to memory fragmentation.<\/span><\/p>\n<p><b>Not suitable for certain applications:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The stack data structure is ill-suited for applications that demand access to elements in the middle of the stack, such as searching or sorting algorithms.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><b>Stack Implementation<\/b><\/h2>\n<p><b>&#8216;Initialize Screen Stack<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">sub initScreenStack()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m.screens = m.top.findNode(\"screens\")<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m.screenStack = []<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span><\/pre>\n<p><b>&#8216;Create Object of the new Screen<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">function createScreen(screenName as string, id) as object<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0<\/span><span style=\"font-weight: 400;\">m[screenName] = CreateObject(\"roSGNode\", id)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m[screenName].id = id<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m[screenName].name = screenName<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0showScreen(m.[screenName])<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0return m[screenName]<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end function<\/span><\/pre>\n<p><b>&#8216;Display new screen on top of Scene.<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">sub showScreen(node as object)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m.screens.AppendChild(node) ' add new screen to scene<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0' show new screen<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m.screenStack.Push(node) ' add new screen to the screen stack<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span><\/pre>\n<p><b>&#8216;Close the current screen and make visible the previous screen<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">sub closeScreen<\/span><b>()<\/b>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0if m.screenStack.Count() &gt; 1<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cur = m.screenStack[m.screens.getChildren(m.screens.getChildCount(), 0).Count() - 1]<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m.screens.removeChildIndex(m.screens.getChildren(m.screens.getChildCount(), 0).Count() - 1)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m.screenStack.Pop() ' remove screen from screenStack<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m[cur.name] = invalid<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0' take previous screen and make it visible<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0prev = m.screenStack[m.screens.getChildren(m.screens.getChildCount(), 0).Count() - 1]<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if prev &lt;&gt; invalid<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0prev.visible = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0prev.setFocus = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0else<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m.screens.removeChildIndex(m.screens.getChildren(m.screens.getChildCount(), 0).Count() - 1)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0screenObj = m.screenStack[m.screens.getChildren(3000, 0).Count() - 1]<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0if screenObj &lt;&gt; invalid<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0screenObj.setFocus = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0else<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0getMainScene().setFocus = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span><\/pre>\n<pre><span style=\"font-weight: 400;\">sub <\/span><b>hideScreen<\/b><span style=\"font-weight: 400;\">()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0prev = m.screenStack[m.screens.getChildren(m.screens.getChildCount(), 0).Count() - 1]<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0if prev &lt;&gt; invalid<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0prev.visible = false<\/span>\r\n\r\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0end if<\/span>\r\n<span style=\"font-weight: 400;\">end sub<\/span><\/pre>\n<p>&#8216;Add new screen to Scene and stack<\/p>\n<pre><span style=\"font-weight: 400;\">sub <\/span><b>addScreen<\/b><span style=\"font-weight: 400;\">(node as object)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m.screens.AppendChild(node) ' add new screen to scene<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0m.screenStack.Push(node) ' add new screen to the screen stack<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span><\/pre>\n<p><b>&#8216;Remove screen from stack and hide it.<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">sub clearScreenStack()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0if m.screenStack.Count() &gt; 1<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while m.screenStack.Count() &gt; 1<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0last = m.screenStack.Pop() ' remove screen from screenStack<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if last.visible = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0last.visible = false ' hide screen<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m.screens.RemoveChild(last)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end while<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0else<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0m.screenStack.Peek().visible = false ' take current screen from screen stack but don't delete it<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span>\r\n\r\n<b>'Get the current screen but do not delete it from stack<\/b><\/pre>\n<pre><span style=\"font-weight: 400;\">function getCurrentScreen()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0return m.screenStack.Peek()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end function<\/span>\r\n\r\n<b>'Check if screen is available in Stack<\/b><\/pre>\n<pre><span style=\"font-weight: 400;\">function isScreenInScreenStack(node as object) as boolean<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0' check if screen stack contains specified node<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0for each screen in m.screenStack<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result = screen.IsSameNode(node)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if result = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return true<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0end for<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0return false<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end function<\/span>\r\n\r\n\r\n<\/pre>\n<p><b>Utilization of Stack<\/b><\/p>\n<p><b>MainScene.brs<br \/>\n<\/b><b>&#8216;Initialize the Application components<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">sub init()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u2018Initialize Application main components<\/span>\r\n\r\n<span style=\"font-weight: 400;\">End sub<\/span><\/pre>\n<pre><span style=\"font-weight: 400;\">sub launchScreenA()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0hideScreen()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0createScreen(\"ScreenA\", \"ScreenA\")<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span>\r\n\r\n\r\n<\/pre>\n<pre><span style=\"font-weight: 400;\">sub launchScreenB()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0hideScreen()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0createScreen(\"ScreenB\", \"ScreenB\")<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span><\/pre>\n<p><b>&#8216;Back event handling<\/b><\/p>\n<pre><span style=\"font-weight: 400;\">sub onKeyEvent(key as string, press as boolean) as boolean<\/span>\r\n\r\n<span style=\"font-weight: 400;\">result = false<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0if press then<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if key = getRemoteEvents().back<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if m.screenStack.Count() &gt; 1<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0closeScreen()<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/displayOrCloseAnyScreen(true)<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0result = true<\/span>\r\n\r\n<span style=\"font-weight: 400;\"> \u00a0 end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end if<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0end if\u00a0<\/span>\r\n\r\n<span style=\"font-weight: 400;\">end sub<\/span>\r\n\r\n<\/pre>\n<p><b>Practical Implementation<\/b><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Sample code explanation<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Code execution<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Q&amp;A<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Sample Code Link:\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/drive.google.com\/file\/d\/1l74vyz0FFWXcwY4eY5E28leX6GeqtySu\/view?usp=sharing\"><span style=\"font-weight: 400;\">https:\/\/github.com\/ersps25\/StackMethodology-Roku<\/span><\/a><\/p>\n<p><b>References<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/developer.roku.com\/docs\/references\/scenegraph\/layout-group-nodes\/group.md\"><b>https:\/\/developer.roku.com\/docs\/references\/scenegraph\/layout-group-nodes\/group.md<\/b><\/a><\/li>\n<\/ul>\n<ul>\n<li><a href=\"https:\/\/developer.roku.com\/docs\/references\/scenegraph\/scene.md\"><b>https:\/\/developer.roku.com\/docs\/references\/scenegraph\/scene.md<\/b><\/a><\/li>\n<\/ul>\n<ul>\n<li><a href=\"https:\/\/developer.roku.com\/docs\/developer-program\/core-concepts\/scenegraph-xml\/node-field-observers.md\"><b>https:\/\/developer.roku.com\/docs\/developer-program\/core-concepts\/scenegraph-xml\/node-field-observers.md<\/b><\/a><\/li>\n<\/ul>\n<p><code><\/code><\/p>\n<div class=\"ap-custom-wrapper\"><\/div><!--ap-custom-wrapper-->","protected":false},"excerpt":{"rendered":"<p>Table of Contents What is Roku? What is Stack Methodology? Advantages Disadvantages Stack Implementation Stack utilization Sample Channel discussion and execution References What is Roku?\u00a0 Roku is a brand and platform known for its streaming media players and smart TVs. It was developed by Roku, Inc., an American company founded in 2002. Roku devices are [&hellip;]<\/p>\n","protected":false},"author":1375,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":47},"categories":[3479,3477,1994],"tags":[4479,3474,5823,5822],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/61101"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1375"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=61101"}],"version-history":[{"count":10,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/61101\/revisions"}],"predecessor-version":[{"id":61321,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/61101\/revisions\/61321"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=61101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=61101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=61101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}