Can filtering be done more efficiently with/without sql joins?
I don't understand your two choices, but I feel sure that a LEFT JOIN is involved.

Ponder something like this:  Step 1:

SELECT uv.video_id
    FROM (
        SELECT uf.friend_id    -- all your friends
            FROM user_friend AS uf
            WHERE uf.user_id = u.id
              AND u.id = 123   -- you
         ) AS f
        LEFT JOIN user_view AS uv  ON uv.user_id = f.friend_id
        WHERE uv.id IS NULL    -- that they did not view


But, beware, the output could be very long.

I don't know if you need DISTINCT after SELECT.

Step 2:  Now to peel off the 30 highest ranked ones:

SELECT v.id
    FROM ( the above query ) AS b
    JOIN video AS v  ON b.video_id = v.id
    ORDER BY rank DESC
    LIMIT 30


Unfortunately, the query must find all the un-viewed videos before it can sort to locate the top 30.