# エロファン (EroFan) - 高画質動画まとめサイト ## プロジェクト概要 多言語対応の高画質動画まとめサイト。日本語、英語、韓国語、中国語に対応。 ## 技術スタック - **言語**: PHP 8.3 - **データベース**: MySQL (Sakura Internet) - **環境**: Macbook Air M-series - **制約**: ターミナル使用不可(初期化レベルのトラブル) - **デプロイ方法**: FTP経由のみ ## 重要な制約事項 ⚠️ **ターミナルが使用不可**: 初期SQL設定時のトラブルにより、ターミナルが完全に使用不可能な状態。パソコン初期化しない限り復旧不可。 - すべての作業はFTP経由で実行 - サーバー側で実行可能なスクリプトでの作業が必須 ## アーキテクチャ ### ファイル構成 ``` / ├── index.php # メインページ(多言語対応・ランキング機能) ├── video_view.php # 動画視聴ページ ├── clusters.php # カテゴリクラスタページ ├── favorites.php # お気に入り機能 ├── style.css # メインスタイル ├── core-functions.js # コア機能(検索・フィルター) ├── mobile-ui.js # モバイルUI制御 ├── category-manager.js # カテゴリ管理 ├── advanced-lazy-loading.js # 遅延読み込み └── llms.txt # このファイル ``` ### データベース構成 ```sql -- 接続情報 Host: mysql3107.db.sakura.ne.jp Database: nightlifebest_videos User: nightlifebest_videos -- 主要テーブル trending_videos ( id, video_id, title, description, thumbnail_url, duration, total_views, daily_views, last_updated, upload_date, platform, embed_url ) tags (id, tag_name) video_tags (video_id, tag_id) ``` ## コア機能 ### 1. 多言語対応システム - **サポート言語**: 日本語(ja), 英語(en), 韓国語(ko), 中国語(zh) - **言語検出**: URL > セッション > ブラウザ > デフォルト(ja) - **翻訳関数**: `t($key, $fallback, $params)` - **URL構造**: `/?lang=en` (日本語時はlangパラメータ不要) ```php // 言語切り替え例 $current_language = detectUserLanguage(); echo t('site-name', 'エロファン'); // 現在の言語で表示 ``` ### 2. ランキングシステム - **期間別ランキング**: - `latest`: 新着順 - `day`: 24時間ランキング - `week`: 週間ランキング - `month`: 月間ランキング - `all_time`: 全期間ランキング - **動的制限**: `getDynamicViewsLimit()` で検索語・期間により制限を調整 - **キャッシュ**: 現在は無効化(`CACHE_TTL`設定あり) ### 3. 検索機能 - **シノニム展開**: 類義語を自動展開して検索範囲を拡大 - **多言語検索**: 各言語のキーワードに対応 - **検索オプション**: 並び順・表示件数・期間フィルター ```php $synonyms = [ '美女' => ['美人', 'かわいい', 'beautiful', '미녀', '美丽的女人'], // ... ]; ``` ### 4. カテゴリシステム - **動的カテゴリ取得**: `getCategoryVideosWithUrls()` - **カテゴリキーワードマッピング**: 言語別キーワード対応 - **カテゴリ一覧**: `getAllCategories($language)` ### 5. SEO最適化 - **動的メタタグ**: 検索語・期間・ページ数に応じた最適化 - **構造化データ**: JSON-LD形式でVideoObject実装 - **Canonical URL**: 重複コンテンツ防止 - **hreflang**: 多言語SEO対応 ## 主要関数リファレンス ### データ取得 ```php getLatestVideos($pdo, $limit, $search, $sort, $offset, $views_limit, $force_refresh) getRankingVideos($pdo, $period, $limit, $views_limit, $force_refresh) getAllTimeRankingVideos($pdo, $limit, $views_limit, $force_refresh) getEnhancedSearchVideos($pdo, $search_query, $synonyms, $limit, $sort, $offset, $views_limit, $force_refresh) getCategoryVideosWithUrls($category, $limit, $period, $force_refresh) ``` ### ユーティリティ ```php sanitizeOutput($str) # HTML出力のサニタイズ formatDuration($duration_str) # 動画時間の整形 formatViewCount($count) # 再生数の整形(1.2K, 3.5M等) timeAgo($datetime) # 相対時間表示(○分前等) getThumbnailUrl($video) # サムネイルURL取得 getVideoUrl($video) # 動画視聴ページURL生成 ``` ### 多言語 ```php detectUserLanguage() # 言語自動検出 t($key, $fallback, $params) # 翻訳取得 generateLanguageLinks($current_params) # 言語切り替えリンク生成 getCategoryDisplayName($category, $lang) # カテゴリ名翻訳 ``` ### SEO ```php generateOptimizedTitle($search, $period, $page) generateOptimizedDescription($search, $period, $total, $page) generateCanonicalUrl($search, $period, $page) generateStructuredData($title, $description, $url, $videos) ``` ## パフォーマンス最適化 ### キャッシュ戦略(現在無効化中) ```php define('CACHE_TTL', 60); # 短期キャッシュ(1分) define('LONG_CACHE_TTL', 3600); # 長期キャッシュ(1時間) // 完全キャッシュ無効化ヘッダー header('Cache-Control: no-store, no-cache, must-revalidate'); header('Pragma: no-cache'); header('Expires: -1'); ``` ### 遅延読み込み - JavaScript: `advanced-lazy-loading.js` - 画像: `loading=\"lazy\"` 属性 - CSS: 非同期読み込み ## セキュリティ ### 基本対策 ```php // 入力サニタイズ $search_query = sanitizeSearchQuery($_GET['search']); // 出力エスケープ echo sanitizeOutput($video['title']); // PDOプリペアドステートメント $stmt = $pdo->prepare(\"SELECT * FROM videos WHERE id = ?\"); $stmt->execute([$id]); ``` ### セキュリティヘッダー ```php header('X-Content-Type-Options: nosniff'); header('X-Frame-Options: SAMEORIGIN'); header('X-XSS-Protection: 1; mode=block'); header('Referrer-Policy: strict-origin-when-cross-origin'); header('Permissions-Policy: geolocation=(), microphone=(), camera=()'); ``` ## 既知の問題・制約 1. **ターミナル使用不可**: すべてFTP経由での作業が必須 2. **キャッシュ無効化**: 現在はリアルタイム更新優先でキャッシュOFF 3. **データベース接続エラー処理**: フォールバックでサンプルデータ表示 ## デプロイ手順(FTP限定) ### 1. ファイルアップロード - FTPクライアント(FileZilla等)を使用 - すべてのPHP/JS/CSSファイルをアップロード ### 2. データベース設定確認 ```php // index.php内の接続情報を確認 $db_host = 'mysql3107.db.sakura.ne.jp'; $db_user = 'nightlifebest_videos'; $db_pass = 'aspireone1A'; $db_name = 'nightlifebest_videos'; ``` ### 3. パーミッション設定 - PHP実行: 755 - ディレクトリ: 755 - 静的ファイル: 644 ### 4. 動作確認 - トップページ: `/` - ランキング: `/?period=day` - 検索: `/?search=美女` - 多言語: `/?lang=en` ## トラブルシューティング ### 言語切り替えがリセットされる ```php // セッション確認 error_log(\"Session lang: \" . $_SESSION['language']); // 強制リセット ?reset_lang=true ``` ### 月間ランキングが表示されない ```php // 強制リフレッシュ getRankingVideos($pdo, 'month', $limit, $dynamic_limit, true); ``` ### データベース接続エラー ```php // エラーログ確認 error_log(\"Database connection error: \" . $e->getMessage()); // サンプルデータモード確認 if (!$pdo) return getSampleData($limit); ``` ## 開発時の注意点 ### FTP作業専用スクリプトの作成が必要 ターミナルが使えないため、以下の作業はすべてPHPスクリプト化が必要: - データベースマイグレーション - バックアップ・リストア - バッチ処理 - デバッグツール ### 推奨スクリプト例 ```php // db_migrate.php - FTP経由で実行可能 exec($sql); echo \"Migration completed\"; ?> ``` ## 連絡先・リソース - サイトURL: https://ero-video.fun - データベースホスト: mysql3107.db.sakura.ne.jp ## 更新履歴 - 2025-01: 多言語対応実装 - 2025-01: ランキングシステム強化 - 2025-01: カテゴリ機能追加 - 2025-01: SEO最適化実装 --- このドキュメントは、LLMがプロジェクトを理解し、適切なサポートを提供するための情報源です。