<?php namespace App\Controllers; use App\Helpers\ErrorHandler; use App\Helpers\Misc; use App\Helpers\UrlBuilder; /** * Used to be compatible with HTML forms */ class RedirectController { static public function search() { $endpoint = '/'; if (isset($_GET['type'], $_GET['term'])) { $term = trim($_GET['term']); switch ($_GET['type']) { case 'url': $endpoint = self::to_endpoint($term); if (!$endpoint) { ErrorHandler::showText(400, 'Invalid TikTok URL'); return; } break; case 'user': // Remove @ if sent if ($term[0] === '@') { $term = substr($term, 1); } $endpoint = '/@' . urlencode($term); break; case 'tag': // Remove # if sent if ($term[0] === '#') { $term = substr($term, 1); } $endpoint = '/tag/' . urlencode($term); break; case 'music': $endpoint = '/music/' . urlencode($term); break; case 'video': // The @username part is not used, but // it is the schema that TikTok follows $endpoint = '/@placeholder/video/' . urlencode($term); break; } } $url = Misc::url($endpoint); header("Location: {$url}"); } static public function download() { if (!(isset($_GET['videoId'], $_GET['authorUsername'], $_GET['playAddr']))) { ErrorHandler::showText(400, 'Request incomplete'); return; } $watermark = isset($_GET['watermark']) && $_GET['watermark'] === 'yes' ? true : false; $url = ''; if ($watermark) { $url = UrlBuilder::download($_GET['playAddr'], $_GET['authorUsername'], $_GET['videoId'], true); } else { $url = UrlBuilder::download(UrlBuilder::video_external($_GET['authorUsername'], $_GET['videoId']), $_GET['authorUsername'], $_GET['videoId'], false); } header("Location: {$url}"); } /** * to_endpoint maps a TikTok URL into a ProxiTok-compatible endpoint URL. */ static private function to_endpoint(string $url): string { if (preg_match('%^(?:https?://)?(?:www\.)?(?:vm\.|vt\.)?tiktok\.com/(?:t/)?([A-Za-z0-9]+)%', $url, $m)) { // Short video URL return '/@placeholder/video/' . $m[1]; } elseif (preg_match('%^https://www\.tiktok\.com/(.+)%', $url, $m)) { // Username component (which may indicate a user profile URL or a video URL) if (preg_match('%^(@[A-Za-z0-9_.]+)(?:/|$)(.*)%', $m[1], $u)) { if ($u[2] == '') { // User profile URL return '/' . urlencode($u[1]); } elseif (preg_match('%^video/(\d+)%', $u[2], $v)) { // Video URL return '/' . urlencode($u[1]) . '/video/' . urlencode($v[1]); } } elseif (preg_match('%^tag/([^ ]+?)(?:/|$)%', $m[1], $t)) { // Tag URL return '/tag/' . urlencode($t[1]); } elseif (preg_match('%^music/([^ ]+?)(?:/|$)%', $m[1], $m)) { // Music URL return '/music/' . urlencode($m[1]); } } return ''; } }