Roku's ad-free streaming service was already a great deal - now it's adding Disney movies
Back to Tutorials
techTutorialintermediate

Roku's ad-free streaming service was already a great deal - now it's adding Disney movies

March 20, 202614 views6 min read

Learn to build a smart streaming service recommendation system that compares Roku's Howdy with Disney+ to help make informed entertainment subscription decisions.

Introduction

In this tutorial, you'll learn how to create a smart streaming service recommendation system using Roku's API and Python. This system will help you analyze and compare streaming services like Howdy (Roku's ad-free service) with Disney+ to make informed decisions about your entertainment subscriptions. We'll build a tool that fetches streaming availability data, compares pricing, and provides actionable insights.

Prerequisites

  • Python 3.7 or higher installed on your system
  • Basic understanding of Python programming concepts
  • API key from a streaming data provider (we'll use a free tier for demonstration)
  • Knowledge of REST APIs and HTTP requests
  • Basic understanding of JSON data structures

Step 1: Setting Up Your Development Environment

1.1 Install Required Python Packages

We'll need several Python packages to build our streaming service analyzer. The main packages include requests for API communication, pandas for data analysis, and matplotlib for visualization.

pip install requests pandas matplotlib

Why this step: Installing these packages gives us the tools needed to fetch data from APIs, analyze it, and create visual representations of our findings.

1.2 Create Project Structure

Set up a directory structure for our project:

streaming_analyzer/
├── main.py
├── data_fetcher.py
├── analysis.py
└── requirements.txt

Why this step: Organizing our code into separate modules makes it maintainable and follows good software engineering practices.

Step 2: Fetching Streaming Data

2.1 Create Data Fetcher Module

First, we'll create a module to fetch data from streaming APIs:

import requests
import json

API_KEY = "your_api_key_here"
BASE_URL = "https://api.example-streaming-data.com/v1"


def get_streaming_services():
    """Fetch available streaming services"""
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    
    try:
        response = requests.get(f'{BASE_URL}/services', headers=headers)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error fetching services: {e}")
        return None


def get_service_details(service_id):
    """Get detailed information about a specific service"""
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    
    try:
        response = requests.get(f'{BASE_URL}/services/{service_id}', headers=headers)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error fetching service details: {e}")
        return None

Why this step: This module handles all the API communication, making it easy to fetch information about streaming services like Howdy and Disney+.

2.2 Configure Your API Keys

For this tutorial, we'll use mock data since we can't access real streaming APIs without proper credentials. In a production environment, you'd need to register for API access with providers like JustWatch, TMDB, or similar services.

# data_fetcher.py

class MockStreamingData:
    def __init__(self):
        self.mock_data = {
            "howdy": {
                "name": "Howdy",
                "price": 2.99,
                "features": ["Ad-free", "4K streaming", "Unlimited access"],
                "content": ["Movies", "TV Shows", "Originals"],
                "availability": "Roku"
            },
            "disney_plus": {
                "name": "Disney+",
                "price": 7.99,
                "features": ["Ad-free", "4K streaming", "Disney content"],
                "content": ["Disney movies", "Marvel", "Star Wars"],
                "availability": "Multiple platforms"
            }
        }
    
    def get_services(self):
        return list(self.mock_data.values())
    
    def get_service_details(self, service_name):
        return self.mock_data.get(service_name, None)

Why this step: Using mock data allows us to demonstrate the functionality without requiring actual API keys, while still showing how the real implementation would work.

Step 3: Building the Analysis Engine

3.1 Create Analysis Module

Now we'll build the analysis engine that compares streaming services:

import pandas as pd
import matplotlib.pyplot as plt


class StreamingAnalyzer:
    def __init__(self, data_fetcher):
        self.data_fetcher = data_fetcher
        self.services = []
        
    def load_services(self):
        """Load all available streaming services"""
        services_data = self.data_fetcher.get_services()
        if services_data:
            self.services = services_data
            print(f"Loaded {len(self.services)} services")
        else:
            print("Failed to load services")
    
    def compare_pricing(self):
        """Compare pricing of all services"""
        if not self.services:
            print("No services loaded")
            return
        
        df = pd.DataFrame(self.services)
        print("\nPricing Comparison:")
        print(df[['name', 'price']])
        
        # Calculate cost per month
        df['cost_per_month'] = df['price']
        return df
    
    def analyze_features(self):
        """Analyze and compare features across services"""
        if not self.services:
            print("No services loaded")
            return
        
        print("\nFeature Comparison:")
        for service in self.services:
            print(f"{service['name']}: {', '.join(service['features'])}")
    
    def create_visualization(self):
        """Create a price comparison chart"""
        if not self.services:
            print("No services loaded")
            return
        
        df = pd.DataFrame(self.services)
        plt.figure(figsize=(10, 6))
        plt.bar(df['name'], df['price'], color=['blue', 'red'])
        plt.title('Streaming Service Pricing Comparison')
        plt.ylabel('Monthly Price ($)')
        plt.xlabel('Streaming Service')
        plt.grid(axis='y', alpha=0.3)
        plt.tight_layout()
        plt.savefig('pricing_comparison.png')
        print("\nVisualization saved as pricing_comparison.png")

Why this step: This module performs the core analysis tasks, comparing pricing, features, and creating visualizations to help users make informed decisions.

Step 4: Putting It All Together

4.1 Create Main Application

Now we'll create the main application that ties everything together:

from data_fetcher import MockStreamingData
from analysis import StreamingAnalyzer


def main():
    # Initialize data fetcher
    data_fetcher = MockStreamingData()
    
    # Initialize analyzer
    analyzer = StreamingAnalyzer(data_fetcher)
    
    # Load services
    analyzer.load_services()
    
    # Compare pricing
    price_comparison = analyzer.compare_pricing()
    
    # Analyze features
    analyzer.analyze_features()
    
    # Create visualization
    analyzer.create_visualization()
    
    # Provide recommendation
    if price_comparison is not None:
        cheapest_service = price_comparison.loc[price_comparison['price'].idxmin()]
        print(f"\nRecommendation: {cheapest_service['name']} is the most cost-effective option at ${cheapest_service['price']:.2f} per month")


if __name__ == "__main__":
    main()

Why this step: This main function orchestrates our entire application, calling each component in sequence to provide a complete analysis.

4.2 Run Your Application

Execute your application to see the streaming service analysis in action:

python main.py

Why this step: Running the application demonstrates how our tool analyzes streaming services and provides actionable insights.

Step 5: Enhancing Your Analysis

5.1 Add Content Comparison

Enhance your analyzer with content comparison capabilities:

def compare_content(self):
    """Compare content libraries between services"""
    if not self.services:
        print("No services loaded")
        return
    
    print("\nContent Library Comparison:")
    for service in self.services:
        print(f"{service['name']}: {', '.join(service['content'])}")
        
    # Identify unique content
    all_content = set()
    service_content = {}
    
    for service in self.services:
        service_content[service['name']] = set(service['content'])
        all_content.update(service['content'])
    
    print("\nUnique Content by Service:")
    for service_name, content in service_content.items():
        unique_content = content - all_content
        print(f"{service_name}: {', '.join(unique_content)}")

Why this step: Adding content comparison helps users understand what unique value each service provides beyond just price.Summary

In this tutorial, you've built a comprehensive streaming service analysis tool that compares Roku's Howdy service with Disney+. You learned how to fetch streaming data, analyze pricing and features, and create visual comparisons. The tool demonstrates that Howdy's ad-free service at $2.99 per month is indeed a great value compared to Disney+'s $7.99 monthly fee, especially when considering the content differences. This approach can be extended to analyze any number of streaming services and can be enhanced with real API data, more sophisticated analysis algorithms, and additional features like user ratings and content recommendations.

The key takeaway is that with the right tools and data, you can make informed decisions about your streaming subscriptions, potentially saving money while still enjoying the content you love.

Source: ZDNet AI

Related Articles