mirror of
https://gitlab.com/octospacc/Proxatore.git
synced 2025-06-05 17:19:18 +02:00
v0.7, 15/01
This commit is contained in:
485
Proxatore.php
485
Proxatore.php
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
const APPNAME = 'Proxatore';
|
||||
const APPNAME = '🎭️ Proxatore';
|
||||
|
||||
const PLATFORMS = [
|
||||
'facebook' => ['facebook.com', 'm.facebook.com'],
|
||||
@@ -34,7 +34,7 @@ const PLATFORMS_ORDERED = ['telegram'];
|
||||
|
||||
const PLATFORMS_TRACKING = ['facebook', 'xiaohongshu'];
|
||||
|
||||
const PLATFORMS_VIDEO = ['instagram'];
|
||||
const PLATFORMS_VIDEO = ['facebook', 'instagram'];
|
||||
|
||||
const EMBEDS = [
|
||||
'reddit' => ['embed.reddit.com'],
|
||||
@@ -64,30 +64,35 @@ function urlLast($url) {
|
||||
return end(explode('/', trim(parse_url($url, PHP_URL_PATH), '/')));
|
||||
}
|
||||
|
||||
function redirectTo($internalUrl) {
|
||||
header('Location: ' . $_SERVER['SCRIPT_NAME'] . '/' . $internalUrl);
|
||||
die();
|
||||
}
|
||||
|
||||
function fetchContent($url, $redirects=-1) {
|
||||
$ch = curl_init();
|
||||
//$useragent = 'Mozilla/5.0 (X11; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0';
|
||||
$useragent = 'curl/' . curl_version()['version'];
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_MAXREDIRS, $redirects);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
|
||||
$body = curl_exec($ch);
|
||||
http_response_code($code = curl_getinfo($ch, CURLINFO_HTTP_CODE));
|
||||
curl_close($ch);
|
||||
return [
|
||||
'body' => $body,
|
||||
'code' => $code,
|
||||
'url' => curl_getinfo($ch, CURLINFO_REDIRECT_URL),
|
||||
];
|
||||
$ch = curl_init();
|
||||
//$useragent = 'Mozilla/5.0 (X11; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0';
|
||||
$useragent = 'curl/' . curl_version()['version'];
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_MAXREDIRS, $redirects);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
|
||||
$body = curl_exec($ch);
|
||||
http_response_code($code = curl_getinfo($ch, CURLINFO_HTTP_CODE));
|
||||
curl_close($ch);
|
||||
return [
|
||||
'body' => $body,
|
||||
'code' => $code,
|
||||
'url' => curl_getinfo($ch, CURLINFO_REDIRECT_URL),
|
||||
];
|
||||
}
|
||||
|
||||
function makeCanonicalUrl($item) {
|
||||
if (!$item) {
|
||||
return NULL;
|
||||
}
|
||||
return 'https://' . (PLATFORMS[$item['platform']][0] ?? '') . '/' . $item['relativeurl'];
|
||||
return 'https://' . (PLATFORMS[$item['platform']][0] ?: $item['platform']) . '/' . $item['relativeurl'];
|
||||
}
|
||||
|
||||
function makeEmbedUrl($platform, $relativeUrl) {
|
||||
@@ -96,7 +101,7 @@ function makeEmbedUrl($platform, $relativeUrl) {
|
||||
} else if (isset(EMBEDS_PREFIXES_FULL[$platform])) {
|
||||
return 'https://' . EMBEDS_PREFIXES_FULL[$platform] . $relativeUrl;
|
||||
} else {
|
||||
return 'https://' . (EMBEDS[$platform][0] ?: PLATFORMS[$platform][0] ?: PLATFORMS_PROXIES[$platform][0] ?: '') . '/' . trim($relativeUrl, '/') . (EMBEDS_SUFFIXES[$platform] ?? '');
|
||||
return 'https://' . (EMBEDS[$platform][0] ?: PLATFORMS[$platform][0] ?: PLATFORMS_PROXIES[$platform][0] ?: $platform) . '/' . trim($relativeUrl, '/') . (EMBEDS_SUFFIXES[$platform] ?? '');
|
||||
}
|
||||
// switch ($platform) {
|
||||
// case 'tiktok':
|
||||
@@ -113,45 +118,45 @@ function makeScrapeUrl($platform, $relativeUrl) {
|
||||
}
|
||||
|
||||
function parseMetaTags($doc) {
|
||||
$metaTags = [];
|
||||
foreach ($doc->getElementsByTagName('meta') as $meta) {
|
||||
if ($meta->hasAttribute('name') || $meta->hasAttribute('property')) {
|
||||
$metaTags[$meta->getAttribute('name') ?: $meta->getAttribute('property')] = $meta->getAttribute('content');
|
||||
}
|
||||
}
|
||||
return $metaTags;
|
||||
$metaTags = [];
|
||||
foreach ($doc->getElementsByTagName('meta') as $meta) {
|
||||
if ($meta->hasAttribute('name') || $meta->hasAttribute('property')) {
|
||||
$metaTags[$meta->getAttribute('name') ?: $meta->getAttribute('property')] = $meta->getAttribute('content');
|
||||
}
|
||||
}
|
||||
return $metaTags;
|
||||
}
|
||||
|
||||
function loadHistory() {
|
||||
$history = [];
|
||||
if (file_exists(HISTORY_FILE)) {
|
||||
$lines = file(HISTORY_FILE, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
foreach ($lines as $line) {
|
||||
$history[] = json_decode($line, true);
|
||||
}
|
||||
}
|
||||
return $history;
|
||||
$history = [];
|
||||
if (file_exists(HISTORY_FILE)) {
|
||||
$lines = file(HISTORY_FILE, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
foreach ($lines as $line) {
|
||||
$history[] = json_decode($line, true);
|
||||
}
|
||||
}
|
||||
return $history;
|
||||
}
|
||||
|
||||
function saveHistory($entry) {
|
||||
$history = loadHistory();
|
||||
$history = array_filter($history, function ($item) use ($entry) {
|
||||
return $item['platform'] !== $entry['platform'] || $item['relativeurl'] !== $entry['relativeurl'];
|
||||
});
|
||||
$history[] = $entry;
|
||||
$lines = array_map(fn($item) => json_encode($item, JSON_UNESCAPED_SLASHES), $history);
|
||||
file_put_contents(HISTORY_FILE, implode(PHP_EOL, $lines) . PHP_EOL, LOCK_EX);
|
||||
$history = loadHistory();
|
||||
$history = array_filter($history, function ($item) use ($entry) {
|
||||
return $item['platform'] !== $entry['platform'] || $item['relativeurl'] !== $entry['relativeurl'];
|
||||
});
|
||||
$history[] = $entry;
|
||||
$lines = array_map(fn($item) => json_encode($item, JSON_UNESCAPED_SLASHES), $history);
|
||||
file_put_contents(HISTORY_FILE, implode(PHP_EOL, $lines) . PHP_EOL, LOCK_EX);
|
||||
}
|
||||
|
||||
function searchHistory($keyword) {
|
||||
$results = [];
|
||||
$history = loadHistory();
|
||||
foreach ($history as $entry) {
|
||||
if (stripos(json_encode($entry, JSON_UNESCAPED_SLASHES), $keyword) !== false) {
|
||||
$results[] = $entry;
|
||||
}
|
||||
}
|
||||
return $results;
|
||||
$results = [];
|
||||
$history = loadHistory();
|
||||
foreach ($history as $entry) {
|
||||
if (stripos(json_encode($entry, JSON_UNESCAPED_SLASHES), $keyword) !== false) {
|
||||
$results[] = $entry;
|
||||
}
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
$path = $_SERVER['REQUEST_URI'];//parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||
@@ -159,8 +164,7 @@ $immediateResult = null;
|
||||
|
||||
if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
if (str_starts_with(strtolower($search), 'https://')) {
|
||||
header('Location: ' . $_SERVER['SCRIPT_NAME'] . '/' . lstrip($search, 'https://'));
|
||||
die();
|
||||
redirectTo(lstrip($search, 'https://'));
|
||||
}
|
||||
$searchResults = searchHistory($search);
|
||||
} else {
|
||||
@@ -173,38 +177,30 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
|
||||
if (isset(PLATFORMS[$upstream])) {
|
||||
if (isset(PLATFORMS_ALIASES[$upstream])) {
|
||||
header('Location: ' . $_SERVER['SCRIPT_NAME'] . '/' . PLATFORMS_ALIASES[$upstream] . '/' . $relativeUrl);
|
||||
die();
|
||||
redirectTo(PLATFORMS_ALIASES[$upstream] . '/' . $relativeUrl);
|
||||
}
|
||||
$platform = $upstream;
|
||||
$domain = PLATFORMS[$upstream][0];
|
||||
//$upstreamUrl = "https://$domain";
|
||||
} else {
|
||||
foreach ([PLATFORMS_PROXIES, PLATFORMS, EMBEDS] as $array) {
|
||||
foreach ($array as $platform => $domains) {
|
||||
if (in_array($upstream, $domains) || in_array(lstrip($upstream, 'www.'), $domains)) {
|
||||
header('Location: ' . $_SERVER['SCRIPT_NAME'] . '/' . $platform . '/' . $relativeUrl);
|
||||
die();
|
||||
//$upstreamUrl = "https://$upstream";
|
||||
//break;
|
||||
redirectTo($platform . '/' . $relativeUrl);
|
||||
}
|
||||
}
|
||||
unset($platform);
|
||||
}
|
||||
}
|
||||
|
||||
//if (!$platform && $upstream === 'vm.tiktok.com') {
|
||||
// $platform = $upstream;//'tiktok';
|
||||
// //'https://vm.tiktok.com/ZNeKpMrUB/';
|
||||
//}
|
||||
if (!$platform && isset(PLATFORMS_REDIRECTS[$upstream])) {
|
||||
$relativeUrl = trim(parse_url(fetchContent("$upstream/$relativeUrl", 1)['url'], PHP_URL_PATH), '/');
|
||||
$platform = PLATFORMS_REDIRECTS[$upstream];
|
||||
header('Location: ' . $_SERVER['SCRIPT_NAME'] . '/' . $platform . '/' . $relativeUrl);
|
||||
die();
|
||||
redirectTo($platform . '/' . $relativeUrl);
|
||||
} else if (!$platform && (str_ends_with($upstream, '.wordpress.com') || str_ends_with($upstream, '.blogspot.com'))) {
|
||||
$platform = $upstream;
|
||||
}
|
||||
|
||||
if ($relativeUrl && /*$upstreamUrl*/ $platform && ($content = fetchContent(makeScrapeUrl($platform, $relativeUrl)))['body']) {
|
||||
if ($relativeUrl && $platform && ($content = fetchContent(makeScrapeUrl($platform, $relativeUrl)))['body']) {
|
||||
if (!in_array($platform, PLATFORMS_TRACKING)) {
|
||||
$relativeUrl = parse_url($relativeUrl, PHP_URL_PATH);
|
||||
}
|
||||
@@ -216,9 +212,11 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
'relativeurl' => $relativeUrl,
|
||||
//'datetime' => date('Y-m-d H:i:s'),
|
||||
//'request_time' => time(),
|
||||
'locale' => $metaTags['og:locale'] ?? '',
|
||||
'type' => $metaTags['og:type'] ?? '',
|
||||
'image' => $metaTags['og:image'] ?? '',
|
||||
'video' => $metaTags['og:video'] ?? '',
|
||||
'videotype' => $metaTags['og:video:type'] ?? '',
|
||||
'title' => $metaTags['og:title'] ?: $metaTags['og:title'] ?: '',
|
||||
//'author' => $metaTags['og:site_name'] ?? '',
|
||||
'description' => $metaTags['og:description'] ?: $metaTags['description'] ?: '',
|
||||
@@ -233,12 +231,14 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
//echo $vidstr;
|
||||
$startpos = $endpos - strpos(strrev($vidstr), '"');
|
||||
$vidstr = substr($html, $startpos, $endpos-$startpos+1);
|
||||
//echo $vidstr;
|
||||
//echo '|' . $vidpos . '|' . $startpos . '|' . $endpos; //substr($html, $startpos, $endpos);
|
||||
$vidstr = json_decode('"' . json_decode('"' . html_entity_decode($vidstr) . '"'));
|
||||
$vidstr = html_entity_decode($vidstr);
|
||||
//$vidstr = json_decode('"' . json_decode('"' . ($vidstr) . '"') . '');
|
||||
$vidstr = json_decode('"' . json_decode('"' . $vidstr . '"')) ?: json_decode('"' . json_decode('"' . $vidstr) . '"');
|
||||
//$vidstr = json_decode('"' . $vidstr . '"');
|
||||
//echo $vidstr;
|
||||
$immediateResult['video'] = $vidstr;
|
||||
//echo '"' . $vidstr . '"';
|
||||
//echo '|'.$startpos.'|'.$endpos.'|';
|
||||
}
|
||||
if (!$immediateResult['image']) {
|
||||
$doc->loadHTML($html);
|
||||
@@ -254,7 +254,10 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
// saveHistory($immediateResult);
|
||||
//} else
|
||||
if ($content['code'] >= 400) {
|
||||
$searchResults = searchHistory($relativeUrl);
|
||||
$searchResults = searchHistory(json_encode([
|
||||
'platform' => $platform,
|
||||
'relativeurl' => $relativeUrl,
|
||||
], JSON_UNESCAPED_SLASHES));//('"platform":"' . $platform . '","relativeurl":"' . $relativeUrl . '"');
|
||||
$immediateResult = $searchResults[0];
|
||||
} else {
|
||||
saveHistory($immediateResult);
|
||||
@@ -275,188 +278,196 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
<meta name="description" content="<?= htmlspecialchars($immediateResult['description'] ?? 'Content Proxy for viewing media and text from various platforms.') ?>" />
|
||||
<meta property="og:title" content="<?= htmlspecialchars($immediateResult['title'] ?? APPNAME) ?>" />
|
||||
<meta property="og:description" content="<?= htmlspecialchars($immediateResult['description'] ?? 'View content from supported platforms.') ?>" />
|
||||
<meta property="og:locale" content="<?= htmlspecialchars($immediateResult['locale'] ?? '') ?>" />
|
||||
<meta property="og:type" content="<?= htmlspecialchars($immediateResult['type'] ?? '') ?>" />
|
||||
<meta property="og:image" content="<?= htmlspecialchars($immediateResult['image'] ?? '') ?>" />
|
||||
<?php if ($immediateResult['video']): ?>
|
||||
<meta property="og:video" content="<?= htmlspecialchars($immediateResult['video']) ?>" />
|
||||
<meta property="og:video:secure_url" content="<?= htmlspecialchars($immediateResult['video']) ?>" />
|
||||
<meta property="og:video:type" content="video/mp4" />
|
||||
<meta property="og:video:type" content="<?= htmlspecialchars($immediateResult['videotype'] ?: 'video/mp4') ?>" />
|
||||
<?php endif; ?>
|
||||
<meta property="og:site_name" content="<?= APPNAME . ' ' . $immediateResult['platform'] ?>" />
|
||||
<meta property="og:url" content="<?= htmlspecialchars(makeCanonicalUrl($immediateResult)) ?>" />
|
||||
<link rel="canonical" href="<?= htmlspecialchars(makeCanonicalUrl($immediateResult)) ?>" />
|
||||
<!--<link rel="alternate" type="application/json+oembed" href="" />
|
||||
<link rel="alternate" type="application/xml+oembed" href="" />-->
|
||||
<style>
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
body {
|
||||
font-family: 'Roboto', Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
background-color: #f0f2f5;
|
||||
color: #1c1e21;
|
||||
}
|
||||
iframe {
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
body {
|
||||
font-family: 'Roboto', Arial, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
background-color: #f0f2f5;
|
||||
color: #1c1e21;
|
||||
}
|
||||
iframe {
|
||||
width: 100%;
|
||||
height: 90vh;
|
||||
border: none;
|
||||
}
|
||||
.container {
|
||||
max-width: 900px;
|
||||
width: 90%;
|
||||
margin: 20px;
|
||||
padding: 20px;
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
||||
overflow: hidden;
|
||||
}
|
||||
a.button {
|
||||
padding: 0.5em;
|
||||
border: 1px solid gray;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
margin: 0.5em;
|
||||
display: inline-block;
|
||||
}
|
||||
a.button.block {
|
||||
display: block;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
a.button.block code {
|
||||
text-decoration: underline;
|
||||
}
|
||||
h1, h1 a {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
font-size: 2rem;
|
||||
color: #1877f2;
|
||||
text-decoration: none;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.5rem;
|
||||
margin-top: 20px;
|
||||
color: #444;
|
||||
border-bottom: 2px solid #1877f2;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
.history-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid #e6e6e6;
|
||||
padding: 15px 0;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
.history-item:hover {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
.history-item img, .history-item video {
|
||||
/*width: 49%;
|
||||
max-width: 49%;*/
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
/* max-width: 100px;
|
||||
max-height: 100px; */
|
||||
margin-right: 15px;
|
||||
border-radius: 4px;
|
||||
object-fit: cover;
|
||||
}
|
||||
.history-item div {
|
||||
/*display: flex;*/
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
max-width: 49%;
|
||||
width: 49%;
|
||||
/*padding: 1em;*/
|
||||
}
|
||||
img, video {
|
||||
padding: 1em;
|
||||
}
|
||||
img[src=""], video[src=""] {
|
||||
display: none;
|
||||
}
|
||||
img + img,
|
||||
video:not(video[src=""]) + img {
|
||||
max-width: 45% !important;
|
||||
}
|
||||
.history-item strong {
|
||||
font-size: 1.2rem;
|
||||
color: #1c1e21;
|
||||
margin-bottom: 5px;
|
||||
display: -webkit-box;
|
||||
}
|
||||
.history-item.ellipsize strong {
|
||||
-webkit-line-clamp: 5;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
.history-item small {
|
||||
font-size: 0.9rem;
|
||||
color: #606770;
|
||||
}
|
||||
.history-item .title {
|
||||
display: none;
|
||||
}
|
||||
.search-bar {
|
||||
margin-bottom: 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.search-bar input {
|
||||
flex: 1;
|
||||
max-width: 600px;
|
||||
padding: 10px 15px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 25px;
|
||||
font-size: 1rem;
|
||||
transition: box-shadow 0.3s, border-color 0.3s;
|
||||
}
|
||||
.search-bar input:focus {
|
||||
border-color: #1877f2;
|
||||
box-shadow: 0 0 5px rgba(24, 119, 242, 0.5);
|
||||
outline: none;
|
||||
}
|
||||
.search-bar button {
|
||||
margin-left: 10px;
|
||||
padding: 10px 20px;
|
||||
background-color: #1877f2;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 25px;
|
||||
font-size: 1rem;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
.search-bar button:hover {
|
||||
background-color: #155dbb;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.search-bar input {
|
||||
width: 100%;
|
||||
height: 90vh;
|
||||
border: none;
|
||||
}
|
||||
.container {
|
||||
max-width: 900px;
|
||||
width: 90%;
|
||||
margin: 20px;
|
||||
padding: 20px;
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
||||
overflow: hidden;
|
||||
}
|
||||
a.button {
|
||||
padding: 0.5em;
|
||||
border: 1px solid gray;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
margin: 0.5em;
|
||||
display: inline-block;
|
||||
}
|
||||
a.button.block {
|
||||
display: block;
|
||||
}
|
||||
h1, h1 a {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
font-size: 2rem;
|
||||
color: #1877f2;
|
||||
text-decoration: none;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.5rem;
|
||||
margin-top: 20px;
|
||||
color: #444;
|
||||
border-bottom: 2px solid #1877f2;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
.history-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid #e6e6e6;
|
||||
padding: 15px 0;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
.history-item:hover {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
.history-item img, .history-item video {
|
||||
/*width: 49%;
|
||||
max-width: 49%;*/
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
/* max-width: 100px;
|
||||
max-height: 100px; */
|
||||
margin-right: 15px;
|
||||
border-radius: 4px;
|
||||
object-fit: cover;
|
||||
}
|
||||
.history-item div {
|
||||
/*display: flex;*/
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
max-width: 49%;
|
||||
width: 49%;
|
||||
/*padding: 1em;*/
|
||||
}
|
||||
img, video {
|
||||
padding: 1em;
|
||||
}
|
||||
img[src=""], video[src=""] {
|
||||
display: none;
|
||||
}
|
||||
img + img,
|
||||
video:not(video[src=""]) + img {
|
||||
max-width: 45% !important;
|
||||
}
|
||||
.history-item strong {
|
||||
font-size: 1.2rem;
|
||||
color: #1c1e21;
|
||||
margin-bottom: 5px;
|
||||
display: -webkit-box;
|
||||
}
|
||||
.history-item.ellipsize strong {
|
||||
-webkit-line-clamp: 5;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
.history-item small {
|
||||
font-size: 0.9rem;
|
||||
color: #606770;
|
||||
}
|
||||
.history-item .title {
|
||||
display: none;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.search-bar {
|
||||
margin-bottom: 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.search-bar input {
|
||||
flex: 1;
|
||||
max-width: 600px;
|
||||
padding: 10px 15px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 25px;
|
||||
font-size: 1rem;
|
||||
transition: box-shadow 0.3s, border-color 0.3s;
|
||||
}
|
||||
.search-bar input:focus {
|
||||
border-color: #1877f2;
|
||||
box-shadow: 0 0 5px rgba(24, 119, 242, 0.5);
|
||||
outline: none;
|
||||
flex-direction: column;
|
||||
}
|
||||
.search-bar button {
|
||||
margin-left: 10px;
|
||||
padding: 10px 20px;
|
||||
background-color: #1877f2;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 25px;
|
||||
font-size: 1rem;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
.search-bar button:hover {
|
||||
background-color: #155dbb;
|
||||
.history-item {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.search-bar input {
|
||||
width: 100%;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.search-bar {
|
||||
flex-direction: column;
|
||||
}
|
||||
.search-bar button {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
.history-item {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.history-item img {
|
||||
margin-bottom: 10px;
|
||||
max-width: 100%;
|
||||
}
|
||||
.history-item div {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
.history-item .title {
|
||||
display: block;
|
||||
}
|
||||
.history-item img {
|
||||
margin-bottom: 10px;
|
||||
max-width: 100%;
|
||||
}
|
||||
.history-item div {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
.history-item .title {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -498,7 +509,7 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
</p>
|
||||
<p style="white-space: preserve-breaks; border-left: 2px solid black; padding: 1em; word-break: break-word;"><?= /*htmlspecialchars*/($item['description']) ?></p>
|
||||
<p>
|
||||
<a class="button block" href="https://<?= htmlspecialchars(PLATFORMS[$item['platform']][0] ?? '') ?>/<?= htmlspecialchars($item['relativeurl']) ?>" target="_blank" rel="noopener nofollow">Original on <code><?= htmlspecialchars(PLATFORMS[$item['platform']][0] ?? '') ?></code></a>
|
||||
<a class="button block" href="<?= htmlspecialchars(makeCanonicalUrl($item)) ?>" target="_blank" rel="noopener nofollow">Original on <code><?= htmlspecialchars(PLATFORMS[$item['platform']][0] ?: $item['platform']) ?>/<?= htmlspecialchars($item['relativeurl']) ?></code></a>
|
||||
<a class="button block" href="<?= htmlspecialchars($_SERVER['SCRIPT_NAME'] . '/' . $item['platform'] . '/' . $item['relativeurl']) ?>"><?= APPNAME ?> Permalink</a>
|
||||
</p>
|
||||
</div>
|
||||
@@ -508,7 +519,7 @@ if (isset($_GET['search']) && ($search = $_GET['search']) !== '') {
|
||||
<?php if (isset($immediateResult)): ?>
|
||||
<?php if (in_array($immediateResult['platform'], PLATFORMS_ORDERED)): ?>
|
||||
<div>
|
||||
<a class="button" href="<?= end(explode('/', $immediateResult['relativeurl']))-1 ?>">⬅️ Previous</a>
|
||||
<a class="button" href="<?= abs(end(explode('/', $immediateResult['relativeurl']))-1) ?>">⬅️ Previous</a>
|
||||
<a class="button" style="float:right;" href="<?= end(explode('/', $immediateResult['relativeurl']))+1 ?>">➡️ Next</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
Reference in New Issue
Block a user