Update atom feeds, include media alt text. Fixes #3184

This commit is contained in:
Daniel Supernault 2022-01-25 00:39:46 -07:00
parent 8c54ab57ac
commit 5d9b6863b6
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
2 changed files with 61 additions and 43 deletions

View file

@ -5,6 +5,7 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Auth; use Auth;
use Cache; use Cache;
use DB;
use View; use View;
use App\Follower; use App\Follower;
use App\FollowRequest; use App\FollowRequest;
@ -15,6 +16,7 @@ use App\UserFilter;
use League\Fractal; use League\Fractal;
use App\Services\AccountService; use App\Services\AccountService;
use App\Services\FollowerService; use App\Services\FollowerService;
use App\Services\StatusService;
use App\Util\Lexer\Nickname; use App\Util\Lexer\Nickname;
use App\Util\Webfinger\Webfinger; use App\Util\Webfinger\Webfinger;
use App\Transformer\ActivityPub\ProfileOutbox; use App\Transformer\ActivityPub\ProfileOutbox;
@ -187,20 +189,36 @@ class ProfileController extends Controller
{ {
abort_if(!config('federation.atom.enabled'), 404); abort_if(!config('federation.atom.enabled'), 404);
$profile = $user = Profile::whereNull('status')->whereNull('domain')->whereUsername($user)->whereIsPrivate(false)->firstOrFail(); $pid = AccountService::usernameToId($user);
if($profile->status != null) {
return $this->accountCheck($profile); abort_if(!$pid, 404);
}
if($profile->is_private || Auth::check()) { $profile = AccountService::get($pid);
$blocked = $this->blockedProfileCheck($profile);
$check = $this->privateProfileCheck($profile, null); abort_if(!$profile || $profile['locked'] || !$profile['local'], 404);
if($check || $blocked) {
return redirect($profile->url()); $items = DB::table('statuses')
} ->whereProfileId($pid)
} ->whereVisibility('public')
$items = $profile->statuses()->whereHas('media')->whereIn('visibility',['public', 'unlisted'])->orderBy('created_at', 'desc')->take(10)->get(); ->whereType('photo')
return response()->view('atom.user', compact('profile', 'items')) ->latest()
->header('Content-Type', 'application/atom+xml'); ->take(10)
->get()
->map(function($status) {
return StatusService::get($status->id);
})
->filter(function($status) {
return $status &&
isset($status['account']) &&
isset($status['media_attachments']) &&
count($status['media_attachments']);
})
->values();
$permalink = config('app.url') . "/users/{$profile['username']}.atom";
return response()
->view('atom.user', compact('profile', 'items', 'permalink'))
->header('Content-Type', 'application/atom+xml');
} }
public function meRedirect() public function meRedirect()

View file

@ -1,38 +1,38 @@
<?= <?=
/* Using an echo tag here so the `<? ... ?>` won't get parsed as short tags */ /* Using an echo tag here so the `<? ... ?>` won't get parsed as short tags */
'<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL
?> ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
<id>{{$profile->permalink('.atom')}}</id> <id>{{$permalink}}</id>
<title>{{$profile->username}} on Pixelfed</title> <title>{{$profile['username']}} on Pixelfed</title>
<subtitle>{{$profile->bio}}</subtitle> <subtitle type="html">{{$profile['note']}}</subtitle>
<updated>{{$profile->updated_at->toAtomString()}}</updated> <updated>{{$profile['created_at']}}</updated>
<logo></logo> <logo></logo>
<author> <author>
<id>{{$profile->permalink()}}</id> <id>{{$profile['url']}}</id>
<uri>{{$profile->permalink()}}</uri> <uri>{{$profile['url']}}</uri>
<name>{{$profile->permalink()}}</name> <name>{{$profile['url']}}</name>
<summary type="html">{{$profile->bio}}</summary> <summary type="html">{{$profile['note']}}</summary>
<link rel="alternate" type="text/html" href="{{$profile->url()}}"/> <link rel="alternate" type="text/html" href="{{$profile['url']}}"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="{{$profile->avatarUrl()}}"/> <link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="{{$profile['avatar']}}"/>
</author> </author>
<link rel="alternate" type="text/html" href="{{$profile->url()}}"/> <link rel="alternate" type="text/html" href="{{$profile['url']}}"/>
<link rel="self" type="application/atom+xml" href="{{$profile->permalink('.atom')}}"/> <link rel="self" type="application/atom+xml" href="{{$permalink}}"/>
@foreach($items as $item) @foreach($items as $item)
<entry> <entry>
<title>{{ $item->caption }}</title> <title>{{ strip_tags($item['content']) }}</title>
<link rel="alternate" href="{{ $item->url() }}" /> <link rel="alternate" href="{{ $item['url'] }}" />
<id>{{ $item->url() }}</id> <id>{{ $item['url'] }}</id>
<author> <author>
<name> <![CDATA[{{ $item->profile->username }}]]></name> <name> <![CDATA[{{ $profile['username'] }}]]></name>
</author> </author>
<summary type="html"> <summary type="html">
<![CDATA[ <![CDATA[
<img id="rss_item_{{$loop->iteration}}" src="{{ $item->thumb() }}"> <img id="rss_item_{{$loop->iteration}}" src="{{ $item['media_attachments'][0]['url'] }}" alt="{{ $item['media_attachments'][0]['description'] }}">
<p style="padding:10px;">{{ $item->caption }}</p> <p style="padding:10px;">{{ $item['content'] }}</p>
]]> ]]>
</summary> </summary>
<updated>{{ $item->updated_at->toAtomString() }}</updated> <updated>{{ $item['created_at'] }}</updated>
</entry> </entry>
@endforeach @endforeach
</feed> </feed>