Files
zuevav e5a88665cd mailn
2026-04-30 15:14:09 +03:00

247 lines
7.8 KiB
PHP

<?php
/**
* Public Widget API for Flickr Photo Mosaic
* No authentication required - public photos only
*/
// CORS headers for WordPress access
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json');
// Handle preflight
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
// Load configuration
$configFile = __DIR__ . '/config.php';
if (!file_exists($configFile)) {
echo json_encode(['error' => 'Configuration not found']);
exit;
}
$config = require $configFile;
// Autoload classes
spl_autoload_register(function ($class) {
$file = __DIR__ . '/classes/' . $class . '.php';
if (file_exists($file)) {
require_once $file;
}
});
// Widget settings file
$widgetSettingsFile = __DIR__ . '/data/widget_settings.json';
/**
* Get widget settings
*/
function getWidgetSettings($file) {
if (file_exists($file)) {
return json_decode(file_get_contents($file), true) ?: [];
}
return [
'enabled' => true,
'albums' => [],
'max_photos' => 30,
'cache_time' => 3600, // 1 hour
];
}
/**
* Create FlickrAPI instance
*/
function createFlickrAPI($config) {
$flickr = new FlickrAPI(
$config['flickr']['api_key'],
$config['flickr']['api_secret'] ?? '',
$config['flickr_user_id'] ?? ''
);
return $flickr;
}
$action = $_GET['action'] ?? '';
try {
switch ($action) {
case 'get_photos':
// Public endpoint - returns photos for widget
if (empty($config['flickr']['api_key'])) {
echo json_encode(['error' => 'Flickr not configured']);
exit;
}
$settings = getWidgetSettings($widgetSettingsFile);
if (!$settings['enabled']) {
echo json_encode(['error' => 'Widget disabled']);
exit;
}
// Check cache
$cacheFile = __DIR__ . '/data/widget_cache.json';
if (file_exists($cacheFile)) {
$cacheData = json_decode(file_get_contents($cacheFile), true);
if ($cacheData && isset($cacheData['timestamp'])) {
$cacheAge = time() - $cacheData['timestamp'];
if ($cacheAge < ($settings['cache_time'] ?? 3600)) {
echo json_encode([
'success' => true,
'photos' => $cacheData['photos'],
'cached' => true,
]);
exit;
}
}
}
$flickr = createFlickrAPI($config);
$allPhotos = [];
$maxPhotos = $settings['max_photos'] ?? 30;
$selectedAlbums = $settings['albums'] ?? [];
if (empty($selectedAlbums)) {
// If no albums selected, get recent photos
$result = $flickr->getPhotos(1, $maxPhotos);
$allPhotos = $result['photos'] ?? [];
} else {
// Get photos from selected albums
$photosPerAlbum = max(5, ceil($maxPhotos / count($selectedAlbums)));
foreach ($selectedAlbums as $albumId) {
try {
$result = $flickr->getPhotosetPhotos($albumId, 1, $photosPerAlbum);
if (!empty($result['photos'])) {
$allPhotos = array_merge($allPhotos, $result['photos']);
}
} catch (Exception $e) {
// Skip failed album
continue;
}
}
// Shuffle and limit
shuffle($allPhotos);
$allPhotos = array_slice($allPhotos, 0, $maxPhotos);
}
// Simplify photo data for widget
$widgetPhotos = array_map(function($photo) {
$urls = $photo['urls'] ?? [];
return [
'id' => $photo['id'],
'title' => $photo['title'] ?? '',
'thumb' => $urls['small'] ?? $urls['thumbnail'] ?? $urls['square'] ?? '',
'medium' => $urls['medium'] ?? $urls['medium640'] ?? $urls['small'] ?? '',
'large' => $urls['large'] ?? $urls['large2048'] ?? $urls['medium'] ?? '',
'page_url' => $photo['page_url'] ?? '',
];
}, $allPhotos);
// Save to cache
$dataDir = __DIR__ . '/data';
if (!is_dir($dataDir)) {
mkdir($dataDir, 0755, true);
}
file_put_contents($cacheFile, json_encode([
'timestamp' => time(),
'photos' => $widgetPhotos,
]));
echo json_encode([
'success' => true,
'photos' => $widgetPhotos,
'cached' => false,
]);
break;
case 'get_albums':
// For admin - list available albums
session_start();
$auth = new Auth();
if (!$auth->isAuthenticated()) {
http_response_code(401);
echo json_encode(['error' => 'Not authenticated']);
exit;
}
if (empty($config['flickr']['api_key'])) {
echo json_encode(['error' => 'Flickr not configured']);
exit;
}
$flickr = createFlickrAPI($config);
$result = $flickr->getPhotosets(1, 100);
echo json_encode([
'success' => true,
'albums' => $result['albums'],
]);
break;
case 'get_settings':
// For admin - get widget settings
session_start();
$auth = new Auth();
if (!$auth->isAuthenticated()) {
http_response_code(401);
echo json_encode(['error' => 'Not authenticated']);
exit;
}
$settings = getWidgetSettings($widgetSettingsFile);
echo json_encode([
'success' => true,
'settings' => $settings,
]);
break;
case 'save_settings':
// For admin - save widget settings
session_start();
$auth = new Auth();
if (!$auth->isAuthenticated()) {
http_response_code(401);
echo json_encode(['error' => 'Not authenticated']);
exit;
}
$input = json_decode(file_get_contents('php://input'), true);
$settings = [
'enabled' => $input['enabled'] ?? true,
'albums' => $input['albums'] ?? [],
'max_photos' => (int)($input['max_photos'] ?? 30),
'cache_time' => (int)($input['cache_time'] ?? 3600),
];
$dataDir = __DIR__ . '/data';
if (!is_dir($dataDir)) {
mkdir($dataDir, 0755, true);
}
// Clear cache when settings change
$cacheFile = __DIR__ . '/data/widget_cache.json';
if (file_exists($cacheFile)) {
unlink($cacheFile);
}
if (file_put_contents($widgetSettingsFile, json_encode($settings, JSON_PRETTY_PRINT))) {
echo json_encode(['success' => true, 'message' => 'Settings saved']);
} else {
echo json_encode(['error' => 'Failed to save settings']);
}
break;
default:
echo json_encode(['error' => 'Unknown action', 'available' => ['get_photos', 'get_albums', 'get_settings', 'save_settings']]);
}
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['error' => $e->getMessage()]);
}