Previously, photo uploads were nested inside the `else` branch of
`if not video_embed`, meaning photos were only processed when a video
embed succeeded. This caused photo-only tweets to be posted as
text-only because `has_video` was never set, `video_embed` remained
None, and the photo loop was never reached.
Decouple photo collection from video outcome: warn if video failed,
then unconditionally iterate over media items to upload any photos
present. External link card logic is unchanged and still only triggers
when both video and image embeds are absent.