feat: initial commit
This commit is contained in:
commit
be4bda5696
254 changed files with 17416 additions and 0 deletions
16
server/utils/icons.php
Normal file
16
server/utils/icons.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
function getTablerIcon($iconName, $class = '', $size = 24)
|
||||
{
|
||||
$icons = [
|
||||
'article' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-article"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 4m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" /><path d="M7 8h10" /><path d="M7 12h10" /><path d="M7 16h10" /></svg>',
|
||||
'books' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-books"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 4m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M9 4m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z" /><path d="M5 8h4" /><path d="M9 16h4" /><path d="M13.803 4.56l2.184 -.53c.562 -.135 1.133 .19 1.282 .732l3.695 13.418a1.02 1.02 0 0 1 -.634 1.219l-.133 .041l-2.184 .53c-.562 .135 -1.133 -.19 -1.282 -.732l-3.695 -13.418a1.02 1.02 0 0 1 .634 -1.219l.133 -.041z" /><path d="M14 9l4 -1" /><path d="M16 16l3.923 -.98" /></svg>',
|
||||
'device-tv-old' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-device-tv-old"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 7m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z" /><path d="M16 3l-4 4l-4 -4" /><path d="M15 7v13" /><path d="M18 15v.01" /><path d="M18 12v.01" /></svg>',
|
||||
'headphones' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-headphones"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 13m0 2a2 2 0 0 1 2 -2h1a2 2 0 0 1 2 2v3a2 2 0 0 1 -2 2h-1a2 2 0 0 1 -2 -2z" /><path d="M15 13m0 2a2 2 0 0 1 2 -2h1a2 2 0 0 1 2 2v3a2 2 0 0 1 -2 2h-1a2 2 0 0 1 -2 -2z" /><path d="M4 15v-3a8 8 0 0 1 16 0v3" /></svg>',
|
||||
'movie' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-movie"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z" /><path d="M8 4l0 16" /><path d="M16 4l0 16" /><path d="M4 8l4 0" /><path d="M4 16l4 0" /><path d="M4 12l16 0" /><path d="M16 8l4 0" /><path d="M16 16l4 0" /></svg>'
|
||||
];
|
||||
|
||||
return $icons[$iconName] ?? '<span class="icon-placeholder">[Missing: ' . htmlspecialchars($iconName) . ']</span>';
|
||||
}
|
||||
|
||||
?>
|
5
server/utils/init.php
Normal file
5
server/utils/init.php
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?php
|
||||
require_once "icons.php";
|
||||
require_once "media.php";
|
||||
require_once "strings.php";
|
||||
?>
|
75
server/utils/media.php
Normal file
75
server/utils/media.php
Normal file
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
|
||||
function renderAssociatedMedia($artists = [], $books = [], $genres = [], $movies = [], $posts = [], $shows = [])
|
||||
{
|
||||
$media = array_merge($artists, $books, $genres, $movies, $posts, $shows);
|
||||
|
||||
if (empty($media)) return;
|
||||
|
||||
$sections = [
|
||||
"artists" => ["icon" => "headphones", "css_class" => "music", "label" => "Related artist(s)"],
|
||||
"books" => ["icon" => "books", "css_class" => "books", "label" => "Related book(s)"],
|
||||
"genres" => ["icon" => "headphones", "css_class" => "music", "label" => "Related genre(s)"],
|
||||
"movies" => ["icon" => "movie", "css_class" => "movies", "label" => "Related movie(s)"],
|
||||
"posts" => ["icon" => "article", "css_class" => "article", "label" => "Related post(s)"],
|
||||
"shows" => ["icon" => "device-tv-old", "css_class" => "tv", "label" => "Related show(s)"]
|
||||
];
|
||||
|
||||
echo '<div class="associated-media">';
|
||||
|
||||
foreach ($sections as $key => $section) {
|
||||
switch ($key) {
|
||||
case "artists":
|
||||
$items = $artists;
|
||||
break;
|
||||
case "books":
|
||||
$items = $books;
|
||||
break;
|
||||
case "genres":
|
||||
$items = $genres;
|
||||
break;
|
||||
case "movies":
|
||||
$items = $movies;
|
||||
break;
|
||||
case "posts":
|
||||
$items = $posts;
|
||||
break;
|
||||
case "shows":
|
||||
$items = $shows;
|
||||
break;
|
||||
default:
|
||||
$items = [];
|
||||
}
|
||||
|
||||
if (!empty($items)) {
|
||||
echo '<p id="' . htmlspecialchars($key) . '" class="' . htmlspecialchars($section['css_class']) . '">';
|
||||
echo '<span class="icon">' . getTablerIcon($section['icon']) . '</span> ';
|
||||
echo htmlspecialchars($section['label']);
|
||||
echo '</p>';
|
||||
echo '<ul>';
|
||||
|
||||
foreach ($items as $item) {
|
||||
echo '<li class="' . htmlspecialchars($section['css_class']) . '">';
|
||||
echo '<a href="' . htmlspecialchars($item['url']) . '">' . htmlspecialchars($item['title'] ?? $item['name'] ?? 'Untitled') . '</a>';
|
||||
|
||||
if ($key === "artists" && isset($item['total_plays']) && $item['total_plays'] > 0) {
|
||||
echo ' (' . htmlspecialchars($item['total_plays']) . ' play' . ($item['total_plays'] > 1 ? 's' : '') . ')';
|
||||
} elseif ($key === "books" && isset($item['author'])) {
|
||||
echo ' by ' . htmlspecialchars($item['author']);
|
||||
} elseif (($key === "movies" || $key === "shows") && isset($item['year'])) {
|
||||
echo ' (' . htmlspecialchars($item['year']) . ')';
|
||||
} elseif ($key === "posts" && isset($item['date'])) {
|
||||
echo ' (' . date("F j, Y", strtotime($item['date'])) . ')';
|
||||
}
|
||||
|
||||
echo '</li>';
|
||||
}
|
||||
|
||||
echo '</ul>';
|
||||
}
|
||||
}
|
||||
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
?>
|
73
server/utils/strings.php
Normal file
73
server/utils/strings.php
Normal file
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
|
||||
require __DIR__ . "/../../vendor/autoload.php";
|
||||
|
||||
use Kaoken\MarkdownIt\MarkdownIt;
|
||||
use Kaoken\MarkdownIt\Plugins\MarkdownItFootnote;
|
||||
|
||||
function truncateText($text, $limit = 50, $ellipsis = "...")
|
||||
{
|
||||
if (mb_strwidth($text, "UTF-8") <= $limit) return $text;
|
||||
|
||||
$truncated = mb_substr($text, 0, $limit, "UTF-8");
|
||||
$lastSpace = mb_strrpos($truncated, " ", 0, "UTF-8");
|
||||
|
||||
if ($lastSpace !== false) $truncated = mb_substr($truncated, 0, $lastSpace, "UTF-8");
|
||||
|
||||
return $truncated . $ellipsis;
|
||||
}
|
||||
|
||||
function parseMarkdown($markdown)
|
||||
{
|
||||
if (empty($markdown)) return '';
|
||||
|
||||
$md = new MarkdownIt([
|
||||
"html" => true,
|
||||
"linkify" => true,
|
||||
]);
|
||||
|
||||
$md->plugin(new MarkdownItFootnote());
|
||||
|
||||
return $md->render($markdown);
|
||||
}
|
||||
|
||||
function parseCountryField($countryField) {
|
||||
if (empty($countryField)) return null;
|
||||
|
||||
$delimiters = [',', '/', '&', ' and '];
|
||||
$countries = [$countryField];
|
||||
|
||||
foreach ($delimiters as $delimiter) {
|
||||
$tempCountries = [];
|
||||
|
||||
foreach ($countries as $country) {
|
||||
$tempCountries = array_merge($tempCountries, explode($delimiter, $country));
|
||||
}
|
||||
|
||||
$countries = $tempCountries;
|
||||
}
|
||||
|
||||
$countries = array_map('trim', $countries);
|
||||
$countries = array_map('getCountryName', $countries);
|
||||
$countries = array_filter($countries);
|
||||
|
||||
return implode(', ', array_unique($countries));
|
||||
}
|
||||
|
||||
function getCountryName($countryName) {
|
||||
$isoCodes = new \Sokil\IsoCodes\IsoCodesFactory();
|
||||
$countries = $isoCodes->getCountries();
|
||||
$country = $countries->getByAlpha2($countryName);
|
||||
|
||||
if ($country) return $country->getName();
|
||||
|
||||
return ucfirst(strtolower($countryName));
|
||||
}
|
||||
|
||||
function pluralize($count, $string, $trailing = '') {
|
||||
if ((int)$count === 1) return $string;
|
||||
|
||||
return $string . 's' . ($trailing ? $trailing : '');
|
||||
}
|
||||
|
||||
?>
|
Loading…
Add table
Add a link
Reference in a new issue