InstanceService.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace App\Services;
  3. use App\Instance;
  4. use App\Util\Blurhash\Blurhash;
  5. use Cache;
  6. class InstanceService
  7. {
  8. const CACHE_KEY_BY_DOMAIN = 'pf:services:instance:by_domain:';
  9. const CACHE_KEY_BANNED_DOMAINS = 'instances:banned:domains';
  10. const CACHE_KEY_UNLISTED_DOMAINS = 'instances:unlisted:domains';
  11. const CACHE_KEY_NSFW_DOMAINS = 'instances:auto_cw:domains';
  12. const CACHE_KEY_STATS = 'pf:services:instances:stats';
  13. const CACHE_KEY_TOTAL_POSTS = 'pf:services:instances:self:total-posts';
  14. const CACHE_KEY_BANNER_BLURHASH = 'pf:services:instance:header-blurhash:v1';
  15. const CACHE_KEY_API_PEERS_LIST = 'pf:services:instance:api:peers:list:v0';
  16. public function __construct()
  17. {
  18. ini_set('memory_limit', config('pixelfed.memory_limit', '1024M'));
  19. }
  20. public static function getByDomain($domain)
  21. {
  22. return Cache::remember(self::CACHE_KEY_BY_DOMAIN.$domain, 3600, function () use ($domain) {
  23. return Instance::whereDomain($domain)->first();
  24. });
  25. }
  26. public static function getBannedDomains()
  27. {
  28. return Cache::remember(self::CACHE_KEY_BANNED_DOMAINS, 1209600, function () {
  29. return Instance::whereBanned(true)->pluck('domain')->toArray();
  30. });
  31. }
  32. public static function getUnlistedDomains()
  33. {
  34. return Cache::remember(self::CACHE_KEY_UNLISTED_DOMAINS, 1209600, function () {
  35. return Instance::whereUnlisted(true)->pluck('domain')->toArray();
  36. });
  37. }
  38. public static function getNsfwDomains()
  39. {
  40. return Cache::remember(self::CACHE_KEY_NSFW_DOMAINS, 1209600, function () {
  41. return Instance::whereAutoCw(true)->pluck('domain')->toArray();
  42. });
  43. }
  44. public static function software($domain)
  45. {
  46. $key = 'instances:software:'.strtolower($domain);
  47. return Cache::remember($key, 86400, function () use ($domain) {
  48. $instance = Instance::whereDomain($domain)->first();
  49. if (! $instance) {
  50. return;
  51. }
  52. return $instance->software;
  53. });
  54. }
  55. public static function stats()
  56. {
  57. return Cache::remember(self::CACHE_KEY_STATS, 86400, function () {
  58. return [
  59. 'total_count' => Instance::count(),
  60. 'new_count' => Instance::where('created_at', '>', now()->subDays(14))->count(),
  61. 'banned_count' => Instance::whereBanned(true)->count(),
  62. 'nsfw_count' => Instance::whereAutoCw(true)->count(),
  63. ];
  64. });
  65. }
  66. public static function refresh()
  67. {
  68. Cache::forget(self::CACHE_KEY_BANNED_DOMAINS);
  69. Cache::forget(self::CACHE_KEY_UNLISTED_DOMAINS);
  70. Cache::forget(self::CACHE_KEY_NSFW_DOMAINS);
  71. Cache::forget(self::CACHE_KEY_STATS);
  72. Cache::forget(self::CACHE_KEY_API_PEERS_LIST);
  73. self::getBannedDomains();
  74. self::getUnlistedDomains();
  75. self::getNsfwDomains();
  76. return true;
  77. }
  78. public static function totalLocalStatuses()
  79. {
  80. return config_cache('instance.stats.total_local_posts');
  81. }
  82. public static function headerBlurhash()
  83. {
  84. return Cache::rememberForever(self::CACHE_KEY_BANNER_BLURHASH, function () {
  85. if (str_ends_with(config_cache('app.banner_image'), 'headers/default.jpg')) {
  86. return 'UzJR]l{wHZRjM}R%XRkCH?X9xaWEjZj]kAjt';
  87. }
  88. $cached = config_cache('instance.banner.blurhash');
  89. if ($cached) {
  90. return $cached;
  91. }
  92. $file = config_cache('app.banner_image') ?? url(Storage::url('public/headers/default.jpg'));
  93. $image = imagecreatefromstring(file_get_contents($file));
  94. if (! $image) {
  95. return 'UzJR]l{wHZRjM}R%XRkCH?X9xaWEjZj]kAjt';
  96. }
  97. $width = imagesx($image);
  98. $height = imagesy($image);
  99. $pixels = [];
  100. for ($y = 0; $y < $height; $y++) {
  101. $row = [];
  102. for ($x = 0; $x < $width; $x++) {
  103. $index = imagecolorat($image, $x, $y);
  104. $colors = imagecolorsforindex($image, $index);
  105. $row[] = [$colors['red'], $colors['green'], $colors['blue']];
  106. }
  107. $pixels[] = $row;
  108. }
  109. // Free the allocated GdImage object from memory:
  110. imagedestroy($image);
  111. $components_x = 4;
  112. $components_y = 4;
  113. $blurhash = Blurhash::encode($pixels, $components_x, $components_y);
  114. if (strlen($blurhash) > 191) {
  115. return 'UzJR]l{wHZRjM}R%XRkCH?X9xaWEjZj]kAjt';
  116. }
  117. ConfigCacheService::put('instance.banner.blurhash', $blurhash);
  118. return $blurhash;
  119. });
  120. }
  121. }