feat: Add comprehensive documentation suite and reorganize project structure

- Created complete documentation in docs/ directory
- Added PROJECT_OVERVIEW.md with feature highlights and getting started guide
- Added ARCHITECTURE.md with system design and technical details
- Added SECURITY.md with comprehensive security implementation guide
- Added DEVELOPMENT.md with development workflows and best practices
- Added DEPLOYMENT.md with production deployment instructions
- Added API.md with complete REST API documentation
- Added CONTRIBUTING.md with contribution guidelines
- Added CHANGELOG.md with version history and migration notes
- Reorganized all documentation files into docs/ directory for better organization
- Updated README.md with proper documentation links and quick navigation
- Enhanced project structure with professional documentation standards
This commit is contained in:
SamiAhmed7777
2025-10-21 00:39:45 -07:00
commit 0b7e2d0a5b
6080 changed files with 1332936 additions and 0 deletions

View File

@@ -0,0 +1,234 @@
#!/usr/bin/env python3
"""
EasyStream Content Syndication Script
Extracts video metadata and reposts to other platforms
"""
import requests
import json
import time
from datetime import datetime
class EasyStreamSyndicator:
def __init__(self, api_base_url, jwt_token):
self.api_base_url = api_base_url.rstrip('/')
self.headers = {
'Authorization': f'Bearer {jwt_token}',
'Content-Type': 'application/json'
}
def get_videos(self, limit=50, category=None, since_date=None):
"""Get videos from EasyStream API"""
params = {'limit': limit}
if category:
params['category'] = category
if since_date:
params['since'] = since_date
response = requests.get(
f'{self.api_base_url}/api/v1/videos',
headers=self.headers,
params=params
)
if response.status_code == 200:
return response.json()['data']['videos']
else:
print(f"Error fetching videos: {response.status_code}")
return []
def get_video_details(self, video_id):
"""Get detailed video information"""
response = requests.get(
f'{self.api_base_url}/api/v1/videos/{video_id}',
headers=self.headers
)
if response.status_code == 200:
return response.json()['data']
else:
print(f"Error fetching video {video_id}: {response.status_code}")
return None
def post_to_youtube(self, video_data):
"""Post video metadata to YouTube (example)"""
# YouTube API integration would go here
youtube_data = {
'title': video_data['title'],
'description': self.format_description_for_youtube(video_data),
'tags': video_data.get('tags', []),
'category': self.map_category_to_youtube(video_data.get('category')),
'privacy': 'public' if video_data.get('privacy') == 'public' else 'unlisted'
}
print(f"Would post to YouTube: {youtube_data['title']}")
return youtube_data
def post_to_tiktok(self, video_data):
"""Post video metadata to TikTok (example)"""
# TikTok API integration would go here
tiktok_data = {
'title': self.truncate_title_for_tiktok(video_data['title']),
'description': self.format_description_for_tiktok(video_data),
'hashtags': self.extract_hashtags(video_data)
}
print(f"Would post to TikTok: {tiktok_data['title']}")
return tiktok_data
def post_to_twitter(self, video_data):
"""Post video announcement to Twitter"""
# Twitter API integration would go here
tweet_text = self.format_tweet(video_data)
twitter_data = {
'text': tweet_text,
'media_url': f"{self.api_base_url}{video_data['thumbnail_url']}",
'video_url': f"{self.api_base_url}{video_data['video_url']}"
}
print(f"Would tweet: {tweet_text}")
return twitter_data
def post_to_facebook(self, video_data):
"""Post to Facebook Page"""
# Facebook API integration would go here
facebook_data = {
'message': self.format_facebook_post(video_data),
'link': f"{self.api_base_url}{video_data['video_url']}",
'name': video_data['title'],
'description': video_data['description'][:200] + '...'
}
print(f"Would post to Facebook: {video_data['title']}")
return facebook_data
def syndicate_content(self, platforms=['youtube', 'twitter', 'facebook']):
"""Main syndication function"""
print("🚀 Starting content syndication...")
# Get recent videos (last 24 hours)
since_date = datetime.now().strftime('%Y-%m-%d')
videos = self.get_videos(limit=10, since_date=since_date)
print(f"📹 Found {len(videos)} videos to syndicate")
for video in videos:
print(f"\n📝 Processing: {video['title']}")
# Get detailed video info
video_details = self.get_video_details(video['id'])
if not video_details:
continue
# Post to selected platforms
if 'youtube' in platforms:
self.post_to_youtube(video_details)
if 'tiktok' in platforms:
self.post_to_tiktok(video_details)
if 'twitter' in platforms:
self.post_to_twitter(video_details)
if 'facebook' in platforms:
self.post_to_facebook(video_details)
# Rate limiting
time.sleep(2)
print("\n✅ Content syndication completed!")
# Helper methods for formatting content
def format_description_for_youtube(self, video_data):
"""Format description for YouTube"""
description = video_data['description']
# Add source attribution
description += f"\n\n🎥 Originally posted on EasyStream"
description += f"\n👤 Creator: {video_data['uploader']['display_name']}"
description += f"\n🔗 Watch original: {self.api_base_url}{video_data['video_url']}"
# Add hashtags
if video_data.get('tags'):
hashtags = ' '.join([f"#{tag}" for tag in video_data['tags'][:10]])
description += f"\n\n{hashtags}"
return description
def format_description_for_tiktok(self, video_data):
"""Format description for TikTok (shorter)"""
description = video_data['description'][:100] + '...'
# Add hashtags
hashtags = self.extract_hashtags(video_data)
return f"{description} {hashtags}"
def format_tweet(self, video_data):
"""Format tweet (280 char limit)"""
title = video_data['title'][:100]
url = f"{self.api_base_url}{video_data['video_url']}"
# Calculate remaining space for hashtags
base_text = f"🎥 {title}\n\n👀 Watch: {url}"
remaining = 280 - len(base_text) - 10 # Buffer
hashtags = self.extract_hashtags(video_data, max_length=remaining)
return f"{base_text}\n\n{hashtags}"
def format_facebook_post(self, video_data):
"""Format Facebook post"""
post = f"🎥 New Video: {video_data['title']}\n\n"
post += f"{video_data['description'][:300]}...\n\n"
post += f"👤 By: {video_data['uploader']['display_name']}\n"
post += f"👀 {video_data['views']} views\n\n"
post += f"Watch now: {self.api_base_url}{video_data['video_url']}"
return post
def extract_hashtags(self, video_data, max_length=100):
"""Extract and format hashtags"""
tags = video_data.get('tags', [])
category = video_data.get('category', '')
hashtags = []
if category:
hashtags.append(f"#{category}")
for tag in tags:
hashtag = f"#{tag.replace(' ', '')}"
if len(' '.join(hashtags + [hashtag])) <= max_length:
hashtags.append(hashtag)
else:
break
return ' '.join(hashtags)
def truncate_title_for_tiktok(self, title):
"""Truncate title for TikTok"""
return title[:50] + '...' if len(title) > 50 else title
def map_category_to_youtube(self, category):
"""Map EasyStream category to YouTube category"""
category_map = {
'gaming': 'Gaming',
'music': 'Music',
'education': 'Education',
'entertainment': 'Entertainment',
'sports': 'Sports',
'tech': 'Science & Technology'
}
return category_map.get(category, 'Entertainment')
# Usage example
if __name__ == "__main__":
# Configuration
API_BASE_URL = "https://yourdomain.com"
JWT_TOKEN = "your_jwt_token_here"
# Initialize syndicator
syndicator = EasyStreamSyndicator(API_BASE_URL, JWT_TOKEN)
# Syndicate to all platforms
syndicator.syndicate_content(['youtube', 'twitter', 'facebook', 'tiktok'])