Watermark Discussion. - NIGGER MARK N SHIEEET.

What should we use.


  • Total voters
    1,867
This reminds me of how there are people who will get mega butthurt if they take a video game screenshot and someone else reposts it somewhere else.

As long as the video is visible, I don't care. But if you want to redirect people to the site, use the kiwi mark.
There are pros and cons to this. It could bring people to a place that challenges their beliefs and help people to break out if the echo chambers.
The downside is that you might bring annoying normies in.

If you don't want it used at all and to not redirect people to the site, use niggamark.
 
If the one and only footage of a monumental event is plastered with niggermarks is funny as fuck, so funny that preservationfags can seethe.

I believe an issue in this thread is that content was not provided for what exactly sparked niggermarking

the gauntlet has been thrown:
View attachment 7415925
Nice to have the context behind the whole niggermarking debate, so thanks for that, but to be honest it makes the whole situation seem a little petty. Individuals choosing to do it for the specific cows that this dude covers seems reasonable, but who gives a fuck about implementing some site-wide rule because some annoying fag threw some insults at the farms?
 
If you're that much of a purist then do the archival work yourself to ensure that it's "all good man" like holy shit.
It's easier to convince people not to fuck with files than to spend all day, every day unfucking them. This is so retarded that I'm going to get mad and become obsessed with you.

I hate when EWU does it.
Don't forget the obligatory mention of never-before-seen-footage, like interviewing a woman who drove by the crime at some point and got injured because she slammed on her brakes for no reason. EWU is one of the worst channels out there.
 
GPT SLOP INCOMING

Im not familiar with FFMPEG, so my quality is a bit fucked but here we go:


I made a script to insert a displacement map automatically on the frame where the most pixels change.


Here's an example of my code at work


Another example



How to use:
in a command line, with python, FFMPEG and FFPROBE, other python dependancies installed, run

> python3 Watermarker.py video displacement

with optional flags

-o , specify the output, default behavior is overwrite (this doesn't work, you have to specify an output)

-f, frames you want to have the displacement map linger on (Default: 2)

-t, type of insertion method, right now i only have two: (Default: insertion)
insertion, where a still frame is inserted before the frame you want to change
overwrite, where frames are overwritten from after the frame you want to change.

-i, the location of the insertion, also only two choices: (Default: max)
max, the max detected pixel change by FFMPEG
random, a random frame change, but will have a change score above "threshold"

--threshold, a metric that FFMPEG uses to calculate how much a scene has changed. (Default:0)


so for my two examples, it would be

>python3 Watermarker.py NHH.mp4 Swastika.png -o insertionDemo.mp4 -f 2

>python3 Watermarker.py NHH.mp4 Swastika.png -o overwriteDemo.mp4 -t overwrite -f 100



This code is NOT usable for professional purposes, Im actually quite retarded and can't figure out how to stop compression from ruining the quality. This is more or less just a tech demo. If anyone here doesn't mind reading half ChatGPT code I'd appreciate it if they fixed up my FFMPEG commands.

This code is also not tested in the wild, no idea what would happen IRL.

also im pretty sure i wrote this code in such a way that it doesn't brick your OS but run code at your own digression, this is not tested on Linux or MacOS.


Python:
import subprocess #to run FFMPEG commands
import re #regex to read FFMPEG outputs
import cv2 #displacement calculations
import numpy as np #idk bruh ask chatgpt why i need this
import os #file operations
import shutil #directory operations
import argparse #cli bullshit
from fractions import Fraction
import json

TMP_DIR = 'vidTemp'

def run(video, image2, frames=2, type='displacement', insertion='max', threshold=0.4, output=''):
    #image2 must exist
    assert os.path.exists(image2), "make sure to specify your displacement map"
    #make sure TMP_DIR doesn't exist:
    try:
        os.makedirs(TMP_DIR)
    except:
        raise TMPEXISTS(f'{TMP_DIR} already exists, please remove it or change TMP_DIR')
    #calculate output first
    if output == '':
        output = video
    else:
        assert os.path.splitext(video)[1] == os.path.splitext(output)[1] , "file extensions should be the same dumbass"
    #run FFMPEG to get scene changes
    scenes = subprocess.run(
        ['ffmpeg', '-i', video,
         '-filter:v', f"select='gt(scene,{threshold})',metadata=print",
         '-f', 'null', '-'],
        text=True,
        capture_output=True
    )
    #this part is 100% written by chatgpt but im pretty sure all it's doing is using regex to get the scores so its just menial work
    lines = scenes.stderr.split('\n')
    times_scores = []
    score = None

    for line in lines:
        score_match = re.search(r'scene_score=([\d\.eE+-]+)', line)
        time_match = re.search(r'pts_time:([\d\.eE+-]+)', line)
    
        if score_match:
            score = float(score_match.group(1))
        if time_match and score is not None:
            time = float(time_match.group(1))
            times_scores.append((time, score))
            score = None  # reset for next pair
    if not times_scores:
        raise Exception("No scene changes detected. Try lowering your threshold")
    #choose type
    insertion = insertion.lower()
 
    if insertion == 'max':
        frameToInsert = max(times_scores, key=lambda x: x[1])
    elif insertion == 'random':
        frameToInsert = times_scores[np.random.randint(0, len(times_scores))] #importing random makes it too clustered
    else:
        print('Not a valid insertion method, defaulting to max')
        frameToInsert = max(times_scores, key=lambda x: x[1])
 
    if type == 'insertion':
        insert(video, image2, frameToInsert[0], frames, output)
    elif type == 'overwrite':
        overwrite(video, image2, frameToInsert[0], frames, output)
    else:
        print('Not a valid type, defaulting to insert')
        insert(video, image2, frameToInsert[0], frames, output)

 
    #delete the tmp dir
    try:
        shutil.rmtree(TMP_DIR)
        print(f'cleaned up {TMP_DIR}')
    except:
        print(f'failed to clean up {TMP_DIR}, you might want to delete it manually')


class TMPEXISTS(Exception):
    def __init__(self, message="Temporary directory already exists"):
        super().__init__(message)


#100% GPT SLOP, this time I have no idea what it's doing, but i assume it's correct.
def apply_displacement(frame, displacement_map):
    """apply displacement to a frame using the displacement map"""
    h, w = frame.shape[:2]
    disp = cv2.imread(displacement_map, cv2.IMREAD_GRAYSCALE)
    disp = cv2.resize(disp, (w, h))
 
    #normalize displacement to [-1, 1] range
    disp = (disp.astype(np.float32) - 127.5) / 127.5
 
    #create coordinate grids
    y, x = np.mgrid[0:h, 0:w].astype(np.float32)
 
    #apply displacement (scale it to reasonable pixel displacement)
    displacement_strength = 20  #adjust this if you want more/less displacement
    x_displaced = x + disp * displacement_strength
    y_displaced = y + disp * displacement_strength
 
    #remap the frame
    displaced_frame = cv2.remap(frame, x_displaced, y_displaced, cv2.INTER_LINEAR)
    return displaced_frame

#GPT SLOP
def get_video_props(video):
    """Get video properties including SAR using ffprobe with JSON output."""
    result = subprocess.run([
        'ffprobe', '-v', 'quiet',
        '-select_streams', 'v:0',
        '-show_entries', 'stream=width,height,r_frame_rate,pix_fmt,sample_aspect_ratio',
        '-of', 'json', video
    ], capture_output=True, text=True)

    data = json.loads(result.stdout)
    stream = data['streams'][0]

    width = int(stream['width'])
    height = int(stream['height'])
    pix_fmt = stream.get('pix_fmt', 'yuv420p')
    fps_str = stream.get('r_frame_rate', '30/1')
    fps = float(Fraction(fps_str)) if fps_str else 30.0
    sar = stream.get('sample_aspect_ratio', '1:1')  # Default to 1:1 if not specified
 
    return width, height, fps, pix_fmt, sar

#gpt slop
def insert(video, displacement_map, insert_time, frames, output):
    """insert displaced frames before the specified time - quick flash"""
    width, height, fps, pix_fmt, sar = get_video_props(video)
 
    # Extract frame at insert_time with original resolution and SAR
    frame_path = os.path.join(TMP_DIR, 'extract_frame.png')
    subprocess.run([
        'ffmpeg', '-i', video, '-ss', str(insert_time),
        '-vframes', '1', '-vf', f'setsar={sar}',
        frame_path, '-y'
    ], stderr=subprocess.DEVNULL)
 
    # Process displaced frames (same as before)
    frame = cv2.imread(frame_path)
    displaced_frame = apply_displacement(frame, displacement_map)
 
    for i in range(frames):
        displaced_path = os.path.join(TMP_DIR, f'displaced_{i:04d}.png')
        cv2.imwrite(displaced_path, displaced_frame)
 
    # Create flash video with original SAR
    flash_duration = frames / fps
    displaced_vid = os.path.join(TMP_DIR, 'flash.mp4')
    subprocess.run([
        'ffmpeg', '-framerate', str(fps),
        '-i', os.path.join(TMP_DIR, 'displaced_%04d.png'),
        '-c:v', 'libx264', '-pix_fmt', pix_fmt,
        '-vf', f'setsar={sar}',
        '-t', str(flash_duration), displaced_vid, '-y'
    ], stderr=subprocess.DEVNULL)

    # Final concatenation preserving SAR
    subprocess.run([
        'ffmpeg', '-i', video, '-i', displaced_vid,
        '-filter_complex',
        f'''
        [0:v]trim=0:{insert_time},setpts=PTS-STARTPTS,setsar={sar}[v0];
        [0:v]trim=start={insert_time},setpts=PTS-STARTPTS,setsar={sar}[v1];
        [1:v]setpts=PTS-STARTPTS,setsar={sar}[v_insert];
        [v0][v_insert][v1]concat=n=3:v=1:a=0[outv]
        ''',
        '-map', '[outv]', '-map', '0:a',
        '-c:v', 'libx264', '-c:a', 'copy',
        '-pix_fmt', pix_fmt,
        output, '-y'
    ])

#gpt slop
def overwrite(video, displacement_map, start_time, frames, output):
    """1-to-1 replace x frames with displaced versions"""
    width, height, fps, pix_fmt, sar = get_video_props(video)
 
    # Extract and process frames with original SAR
    start_frame = int(start_time * fps)
    frame_dir = os.path.join(TMP_DIR, 'frames')
    os.makedirs(frame_dir)
 
    for i in range(frames):
        frame_num = start_frame + i
        frame_time = frame_num / fps
        frame_path = os.path.join(frame_dir, f'frame_{i:04d}.png')
    
        subprocess.run([
            'ffmpeg', '-i', video, '-ss', str(frame_time),
            '-vframes', '1', '-vf', f'setsar={sar}',
            frame_path, '-y'
        ])
    
        frame = cv2.imread(frame_path)
        displaced_frame = apply_displacement(frame, displacement_map)
        cv2.imwrite(frame_path, displaced_frame)
 
    # Create replacement segment with original SAR
    frame_duration = frames / fps
    displaced_vid = os.path.join(TMP_DIR, 'replaced_frames.mp4')
    subprocess.run([
        'ffmpeg', '-framerate', str(fps),
        '-i', os.path.join(frame_dir, 'frame_%04d.png'),
        '-c:v', 'libx264', '-pix_fmt', pix_fmt,
        '-vf', f'setsar={sar}',
        '-t', str(frame_duration), displaced_vid, '-y'
    ])
 
    # Final concatenation preserving SAR
    end_time = start_time + frame_duration
    subprocess.run([
        'ffmpeg', '-i', video, '-i', displaced_vid,
        '-filter_complex',
        f'''
        [0:v]trim=0:{start_time},setpts=PTS-STARTPTS,setsar={sar}[v1];
        [0:v]trim=start={end_time},setpts=PTS-STARTPTS,setsar={sar}[v2];
        [1:v]setpts=PTS-STARTPTS,setsar={sar}[vdis];
        [v1][vdis][v2]concat=n=3:v=1:a=0[outv]
        ''',
        '-map', '[outv]', '-map', '0:a',
        '-c:v', 'libx264', '-c:a', 'copy',
        '-pix_fmt', pix_fmt,
  
        output, '-y'
    ])


#CLI
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Sneaky Watermark script')
    parser.add_argument('video', help='input video file')
    parser.add_argument('displacement_map', help='displacement map image')
    parser.add_argument('-o', '--output', default='', help='output file (default: overwrites video)')
    parser.add_argument('-f', '--frames', type=int, default=2, help='number of frames (default: 2)')
    parser.add_argument('-t', '--type', choices=['insertion', 'overwrite'], default='insertion', help='operation type (default: insertion)')
    parser.add_argument('-i', '--insertion', choices=['max', 'random'], default='max', help='frame selection method (default: max)')
    parser.add_argument('--threshold', type=float, default=0, help='scene change threshold (only useful for random)')
 
 
    args = parser.parse_args()
 
    try:
        run(args.video, args.displacement_map, args.frames, args.type, args.insertion, args.threshold, args.output)
        print(f'Done!')
    except Exception as e:
        if type(e) != TMPEXISTS:
            try:
                shutil.rmtree(TMP_DIR)
                print(f'cleaned up {TMP_DIR}')
            except:
                print(f'failed to clean up {TMP_DIR}, you might want to delete it manually')
        print(f'something went wrong: {e}')
 
Last edited:
I just skipped through the highlights of what I've missed, so maybe this has been brought up already and the site is shitting itself for me so I'm not going to scour the responses to see if this has been brought up, however,
I find it interesting how the poll has changed since the poll started. At first, the pole was roughly 2/3 in favor of a niggermark, 1/3 in favor of a kiwimark, and a negliguble amount in favor of no mark. Now it's roughly 50% in favor of a niggermark, 45% in favor of a kiwimark, and 5% in no mark. Very interesting to see this change take place and to see people provide easy to use code in order to give those marks.
 
if you’re a poorfag you can just boot up windows 7, and use windows movie maker to add text for the entire length of a given video with the message of your choice on it. Right in the middle of the video for greatest lolz.

This is like when Reddit tried adding watermarks to their shitty memes, but a thousand times better
 
  • Dumb
Reactions: Nguyen Van Phuoc
i wish we had some sort of filter that made the site unreadable to lazy faggot youtubers.

maybe end every sentence with NIGGER instead of a period so they can't just directly screenshot posts.
A man before his time
 
  • Like
Reactions: niggers
Now we just need to watermark every KF post with “nigger”.
I can't remember who made this, but this is basically how kiwifarms should look:
1748323363056.webp
 
Fuck recognition. We are Batman bitch. We wear a mask (avatar and user names) and autisticly research individuals (Phonebooking).
yea i will take the word of some Sharty shitter over the statements made by the guy running the site for sure. Its not about the recognition as that retard. No one here is a hero even if we "stay in the dark" you capeshit connoisseur. It is about people that use this website for content and then demonize it for beeing evil. These people can go and fuck themselves. And for people that are using this website but not crediting it this will force a "shit or get of the pot" type situation.
Nigga, I didn't make Lolcow 756328 smash his foot in the door, I just clipped it. I did nothing in that instance. Everyone should be allowed to laugh. You're no better than the MPA copyright faggots at that point.
Nigga you're altering the kino. You are messing with the sauce. I don't want chives in my fucking spaghetti sauce, I want it RAW, UNCHAINED. I want to taste the tomato in its pure form without faggy watermarks. The farms has no claim over the Kawntent.
Again too retarded to understand the point. But anyway, if this forum just repost, get you sources somewhere else. You want it RAW and UNCHANGED? Do the clipping yourself faggot. If you cannot clip everything simultaneously i guess you will have to life with what the uploader decides to do with it. I don't care whose cock sleeve you are. if its Toms or the Casinos. The Kiwifarms and no one else owes these fuckers anything. The Copyright system has been weaponized against null since forever and i will not die on the "in my morals it is not okay to use guns" and the get shot hill. You can do that little Sharty nigger but don't expect a standing ovation. In masses people still flock to the Farms and ED because autists condensed and filtered the content and that has value in its own right. And if we want to go legal we can always go and look at Spergon of Applebees that has proven that cutting up a video or stream and the reuploading it with a specific context and/or to outline something for example an argument is a legit form of copyright. So everyone else can eat shit on that front.
It's not our place to give a toll. Who died and made (you) God? I don't care if a Youtuber uses our shit. The smart viewer will find his way back here eventually. There is a eco system in place currently that you are about to disrupt and it will hurt the farms long term. You don't have to see it, but it's there. If (you) are so mad, make your own YT channel and read off some kino from the farms. You guys are mad about the money, right? Post it yourselves then if you're so concerned.
Room temperature IQ take. If so many of us didn't have money i doubt josh could have raised that much money TWICE nigga. Content Monkeys get chewed up here regularely because they turn retarded with exceptions for people that just stop like Joji or Luke Nichols. Anyone that is jealous of them has short circuited their brain or are too stupid to understand what fulfillment in life actually means and are too young to understand.
The importance of the archive supersedes the petty need for the watermark.
We are not an Archive but a gossip and shitpost forum. We only archive everything to facilitate specifically that or we would just have a glorified way back machine with a comment section.
1748325361241.webp
also almost 27000 posts in 2.5 years. Josh once spoke about faggots with unbelievable high post rates being the most annoying retarded speds and I can see what he meant. Average of about 28 posts per day touch some grass nigger. Obviously terminally online which gives credence to the being some content monkeys cock sleeve.
 
I understand the desire to punish people who won't dare mention Kiwi Farms but make videos that get all their info and clips from the farms. However I think at the same time these disruptive watermarks kinda go against the ideals of "archive everything". Is something really properly archived if there's a big nigger word obscuring half the clip?
 
There any way we can do Floydmarking where you just have a transparent picture of George Floyd flashing on the screen the entire video? I'll probably do that next time I post a clip. I think it'd be funny to experiment with different watermarks to see if people actually use ones that are still offensive but won't get them banned. Like imagine some faggot needing to explain why George Floyd or the words "Bix Nood" are all over the screen and disavowing it before showing a clip.
 
  • Like
Reactions: Guyspleasedontfight
View attachment 7415299
>erm we actually reserve the right to watermark everything since us kiwicels were actually the ones who came up with the concept of recording lolcows acting retarded
I forgot these Innsmouth-looking freaks existed. Damn.
It's not a virtue to help the lying pieces of shit in the normie media lie about you, even if its funny in the moment.
Stop caring what they fucking think. The site is public. Literally anyone can visit it and see that the bullshit they're spewing is just that - bullshit.
 
Back