added poster for 6th Kyu

This commit is contained in:
marko
2022-02-21 09:52:21 +01:00
parent 9138ce6849
commit 6954adfb11
24 changed files with 280 additions and 118 deletions

View File

@@ -1,82 +1,142 @@
[ [
{ {
"source": "http://mmurl.de/judo32", "source": "http://mmurl.de/judo32",
"target": "videos/6terKyu/Ukemi/MaeMawariUkemi.webm" "target": "videos/6terKyu/Ukemi/MaeMawariUkemi.webm",
"poster": {
"timeIndex": "10.760"
}
}, },
{ {
"source": "http://mmurl.de/judo33", "source": "http://mmurl.de/judo33",
"target": "videos/6terKyu/NageWaza/IpponSeoiNage.webm" "target": "videos/6terKyu/NageWaza/IpponSeoiNage.webm",
"poster": {
"timeIndex": "19.360"
}
}, },
{ {
"source": "http://mmurl.de/judo34", "source": "http://mmurl.de/judo34",
"target": "videos/6terKyu/NageWaza/TaiOtoshi.webm" "target": "videos/6terKyu/NageWaza/TaiOtoshi.webm",
"poster": {
"timeIndex": "30.040"
}
}, },
{ {
"source": "http://mmurl.de/judo35", "source": "http://mmurl.de/judo35",
"target": "videos/6terKyu/NageWaza/KoUchiGari.webm" "target": "videos/6terKyu/NageWaza/KoUchiGari.webm",
"poster": {
"timeIndex": "20.240"
}
}, },
{ {
"source": "http://mmurl.de/judo36", "source": "http://mmurl.de/judo36",
"target": "videos/6terKyu/NageWaza/KoSotoGakeKoSotoGake.webm" "target": "videos/6terKyu/NageWaza/KoSotoGakeKoSotoGari.webm",
"poster": {
"timeIndex": "22.040"
}
}, },
{ {
"source": "http://mmurl.de/judo37", "source": "http://mmurl.de/judo37",
"target": "videos/6terKyu/NageWaza/DeAshiBarei.webm" "target": "videos/6terKyu/NageWaza/DeAshiBarei.webm",
"poster": {
"timeIndex": "24.760"
}
}, },
{ {
"source": "http://mmurl.de/judo38", "source": "http://mmurl.de/judo38",
"target": "videos/6terKyu/NeWaza/KesaGatame.webm" "target": "videos/6terKyu/NeWaza/KesaGatame.webm",
"poster": {
"timeIndex": "40.920"
}
}, },
{ {
"source": "http://mmurl.de/judo39", "source": "http://mmurl.de/judo39",
"target": "videos/6terKyu/NeWaza/YokoShioGatame.webm" "target": "videos/6terKyu/NeWaza/YokoShioGatame.webm",
"poster": {
"timeIndex": "37.040"
}
}, },
{ {
"source": "http://mmurl.de/judo40", "source": "http://mmurl.de/judo40",
"target": "videos/6terKyu/NeWaza/TateShioGatame.webm" "target": "videos/6terKyu/NeWaza/TateShioGatame.webm",
"poster": {
"timeIndex": "32.000"
}
}, },
{ {
"source": "http://mmurl.de/judo41", "source": "http://mmurl.de/judo41",
"target": "videos/6terKyu/NeWaza/KamiShioGatame.webm" "target": "videos/6terKyu/NeWaza/KamiShioGatame.webm",
"poster": {
"timeIndex": "26.960"
}
}, },
{ {
"source": "http://mmurl.de/judo42", "source": "http://mmurl.de/judo42",
"target": "videos/6terKyu/AnwendungTachiWaza/IpponSeoiNage.webm" "target": "videos/6terKyu/AnwendungTachiWaza/IpponSeoiNage.webm",
"poster": {
"timeIndex": "22.480"
}
}, },
{ {
"source": "http://mmurl.de/judo43", "source": "http://mmurl.de/judo43",
"target": "videos/6terKyu/AnwendungTachiWaza/TaiOtoshi.webm" "target": "videos/6terKyu/AnwendungTachiWaza/TaiOtoshi.webm",
"poster": {
"timeIndex": "21.240"
}
}, },
{ {
"source": "http://mmurl.de/judo44", "source": "http://mmurl.de/judo44",
"target": "videos/6terKyu/AnwendungTachiWaza/KoUchiGari.webm" "target": "videos/6terKyu/AnwendungTachiWaza/KoUchiGari.webm",
"poster": {
"timeIndex": "18.440"
}
}, },
{ {
"source": "http://mmurl.de/judo45", "source": "http://mmurl.de/judo45",
"target": "videos/6terKyu/AnwendungTachiWaza/DeAshiBarei.webm" "target": "videos/6terKyu/AnwendungTachiWaza/DeAshiBarei.webm",
"poster": {
"timeIndex": "22.200"
}
}, },
{ {
"source": "http://mmurl.de/judo46", "source": "http://mmurl.de/judo46",
"target": "videos/6terKyu/AnwendungTachiWaza/Ausweichen.webm" "target": "videos/6terKyu/AnwendungTachiWaza/Ausweichen.webm",
"poster": {
"timeIndex": "21.120"
}
}, },
{ {
"source": "http://mmurl.de/judo47", "source": "http://mmurl.de/judo47",
"target": "videos/6terKyu/AnwendungNeWaza/OUchiGari.webm" "target": "videos/6terKyu/AnwendungNeWaza/OUchiGari.webm",
"poster": {
"timeIndex": "21.160"
}
}, },
{ {
"source": "http://mmurl.de/judo48", "source": "http://mmurl.de/judo48",
"target": "videos/6terKyu/AnwendungNeWaza/KoUchiGari.webm" "target": "videos/6terKyu/AnwendungNeWaza/KoUchiGari.webm",
"poster": {
"timeIndex": "19.400"
}
}, },
{ {
"source": "http://mmurl.de/judo49", "source": "http://mmurl.de/judo49",
"target": "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.webm" "target": "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.webm",
}, "poster": {
{ "timeIndex": "16.280"
"source": "http://mmurl.de/judo50", }
"target": "videos/6terKyu/AnwendungNeWaza/AngriffOberlage.webm"
}, },
{ {
"source": "http://mmurl.de/judo51", "source": "http://mmurl.de/judo51",
"target": "videos/6terKyu/AnwendungNeWaza/AngriffUnterlage.webm" "target": "videos/6terKyu/AnwendungNeWaza/AngriffOberlage.webm",
"poster": {
"timeIndex": "25.960"
}
},
{
"source": "http://mmurl.de/judo50",
"target": "videos/6terKyu/AnwendungNeWaza/AngriffUnterlage.webm",
"poster": {
"timeIndex": "38.680"
}
} }
] ]

View File

@@ -9,6 +9,29 @@ import sys
import argparse import argparse
import os import os
# bitrate recommendations as from https://developers.google.com/media/vp9/settings/vod
bitrateProfiles = {
"240": {"heigth": 240, "bitrate": "150k", "minrate": "75k", "maxrate": "218k"},
"360": {"heigth": 360, "bitrate": "276k", "minrate": "138k", "maxrate": "400k"},
"480LQ": {"heigth": 480, "bitrate": "512k", "minrate": "256k", "maxrate": "742k"},
"480MQ": {"heigth": 480, "bitrate": "750k", "minrate": "375k", "maxrate": "1088k"},
"720@30": {"heigth": 720, "bitrate": "1024k", "minrate": "512k", "maxrate": "1485k"},
"720@60": {"heigth": 720, "bitrate": "1800k", "minrate": "900k", "maxrate": "2610k"},
"1080@30": {"heigth": 1080, "bitrate": "1800k", "minrate": "900k", "maxrate": "2610k"},
"1080@60": {"heigth": 1080, "bitrate": "3000k", "minrate": "1500k", "maxrate": "4350k"},
"1440@30": {"heigth": 1440, "bitrate": "6000k", "minrate": "3000k", "maxrate": "8700k"},
"1440@60": {"heigth": 1440, "bitrate": "9000k", "minrate": "4500k", "maxrate": "13050k"},
"2160@30": {"heigth": 2160, "bitrate": "12000k", "minrate": "6000k", "maxrate": "17400k"},
"2160@60": {"heigth": 2160, "bitrate": "18000k", "minrate": "9000k", "maxrate": "26100k"},
}
config = {
'vcodec': "vp9",
'acodec': "libopus",
'bitrateProfile': "480LQ",
'quality': "best",
}
def generate_thumbnail(in_filename, out_filename, time, height): def generate_thumbnail(in_filename, out_filename, time, height):
try: try:
( (
@@ -24,57 +47,23 @@ def generate_thumbnail(in_filename, out_filename, time, height):
sys.exit(1) sys.exit(1)
# setting width and height from hardcoded defaults -> configured defaults -> clip # setting width and height from hardcoded defaults -> configured defaults -> clip
def getDimensions(config, clip): def getDimensions(config, clip, bitrateProfiles):
h = config['height'] if 'height' in config else 480 # set width and height to a default
w = config['width'] if 'width' in config else -2 w, h = -2, 480
# set the height by the bitrateProfile
try:
h = bitrateProfiles[config['bitrateProfile']]
except:
pass
# overwrite it with the scaling
if 'scale' in clip: if 'scale' in clip:
h = clip['scale']['h'] if 'h' in clip['scale'] else h h = clip['scale']['h'] if 'h' in clip['scale'] else h
w = clip['scale']['w'] if 'w' in clip['scale'] else w w = clip['scale']['w'] if 'w' in clip['scale'] else w
return h, w return w, h
config = {
'vcodec': "vp9",
'acodec': "libopus",
'height': 480,
'quality': "best",
}
argParser = argparse.ArgumentParser()
jsonFileName = sys.argv[1]
clipDict = {}
with open(jsonFileName) as jf:
clipDict = json.load(jf)
ydl_opts = {"outtmpl": "%(id)s"}
for clip in clipDict:
# create the directories so ffmpeg doesn't complain
try:
outputDir = os.path.dirname(clip['target'])
os.makedirs(outputDir)
except:
print(f"Couldn't create {outputDir}")
infoDict = None
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
infoDict = ydl.extract_info(clip['source'], download=False)
ydl.download([clip['source']])
if infoDict is not None:
# @todo This is a very bad hack because the outtmpl options doesn't seem to be working if the file gets reencoded
inputFilename = glob.glob(infoDict['id']+"*")[0]
h, w = getDimensions(config, clip)
# generate preview image for the video
if 'poster' in clip:
generate_thumbnail(inputFilename, os.path.splitext(clip['target'])[0]+".jpg", clip['poster']['timeIndex'], h )
def twoPassEncode(inputFilename, clip):
# cutting
kwArgs = {} kwArgs = {}
if 'from' in clip: if 'from' in clip:
kwArgs['ss'] = clip['from'] kwArgs['ss'] = clip['from']
@@ -101,9 +90,9 @@ for clip in clipDict:
# "an":None, # "an":None,
"y": None, "y": None,
"pass": "1", "pass": "1",
# "b:v":"276k", "minrate":"138k", "maxrate":"400k", # x360 "b:v": bitrateProfile[config['bitrateProfile']['bitrate']],
"b:v":"512k", "minrate":"256k", "maxrate":"742k", # x480 LQ "minrate": bitrateProfile[config['bitrateProfile']['minrate']],
# "b:v":"750k", "minrate":"375k", "maxrate":"1088k", # x480 MQ "maxrate": bitrateProfile[config['bitrateProfile']['maxrate']],
"quality": config['quality'] if 'quality' in config else "best", "quality": config['quality'] if 'quality' in config else "best",
} }
) )
@@ -138,12 +127,11 @@ for clip in clipDict:
clip['target'], clip['target'],
vcodec=config['vcodec'], vcodec=config['vcodec'],
**{ **{
# "an":None,
"y": None, "y": None,
"pass": "2", "pass": "2",
# "b:v":"276k", "minrate":"138k", "maxrate":"400k", # x360 "b:v": bitrateProfile[config['bitrateProfile']['bitrate']],
"b:v":"512k", "minrate":"256k", "maxrate":"742k", # x480 LQ "minrate": bitrateProfile[config['bitrateProfile']['minrate']],
# "b:v":"750k", "minrate":"375k", "maxrate":"1088k", # x480 MQ "maxrate": bitrateProfile[config['bitrateProfile']['maxrate']],
"quality": config['quality'] if 'quality' in config else "best", "quality": config['quality'] if 'quality' in config else "best",
"acodec": config['acodec'], "acodec": config['acodec'],
} }
@@ -153,4 +141,38 @@ for clip in clipDict:
except: except:
print(infoDict) print(infoDict)
exit(-1)
argParser = argparse.ArgumentParser()
jsonFileName = sys.argv[1]
clipDict = {}
with open(jsonFileName) as jf:
clipDict = json.load(jf)
ydl_opts = {"outtmpl": "%(id)s"}
for clip in clipDict:
# create the directories so ffmpeg doesn't complain
try:
outputDir = os.path.dirname(clip['target'])
os.makedirs(outputDir)
except:
print(f"Couldn't create {outputDir}")
infoDict = None
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
infoDict = ydl.extract_info(clip['source'], download=False)
ydl.download([clip['source']])
if infoDict is not None:
# @todo This is a very bad hack because the outtmpl options doesn't seem to be working if the file gets reencoded
inputFilename = glob.glob(infoDict['id']+"*")[0]
w, h = getDimensions(config, clip)
# generate preview image for the video
if 'poster' in clip:
generate_thumbnail(inputFilename, os.path.splitext(clip['target'])[0]+".jpg", clip['poster']['timeIndex'], h )
twoPassEncode(inputFilename, clip)

View File

@@ -4,5 +4,9 @@ video:
url: "videos/8terKyu/Ukemi/Ushiro.webm" url: "videos/8terKyu/Ukemi/Ushiro.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/8terKyu/Ukemi/Ushiro.jpg"
width: 854
height: 480
--- ---
Fallen rückwärts wurde bereits in den vorigen Kyu-Stufen intensiv geübt und wird jetzt beherscht. Fallen rückwärts wurde bereits in den vorigen Kyu-Stufen intensiv geübt und wird jetzt beherscht.

View File

@@ -4,5 +4,9 @@ video:
url: "videos/8terKyu/Ukemi/Yoko.webm" url: "videos/8terKyu/Ukemi/Yoko.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/8terKyu/Ukemi/Yoko.jpg"
width: 854
height: 480
--- ---
Fallen seitwärts zu beiden Seiten wurde bereits in den vorigen Kyu-Stufen intensiv geübt und wird jetzt beherscht. Fallen seitwärts zu beiden Seiten wurde bereits in den vorigen Kyu-Stufen intensiv geübt und wird jetzt beherscht.

View File

@@ -4,6 +4,10 @@ video:
url: "videos/8terKyu/Ukemi/MaeMawari.webm" url: "videos/8terKyu/Ukemi/MaeMawari.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/8terKyu/Ukemi/MaeMawari.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NageWaza/IpponSeoiNage.webm" url: "videos/6terKyu/NageWaza/IpponSeoiNage.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NageWaza/IpponSeoiNage.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NageWaza/TaiOtoshi.webm" url: "videos/6terKyu/NageWaza/TaiOtoshi.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NageWaza/TaiOtoshi.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NageWaza/KoSotoGakeKoSotoGari.webm" url: "videos/6terKyu/NageWaza/KoSotoGakeKoSotoGari.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NageWaza/KoSotoGakeKoSotoGari.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NageWaza/DeAshiBarei.webm" url: "videos/6terKyu/NageWaza/DeAshiBarei.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NageWaza/DeAshiBarei.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NeWaza/KesaGatame.webm" url: "videos/6terKyu/NeWaza/KesaGatame.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NeWaza/KesaGatame.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NeWaza/YokoShioGatame.webm" url: "videos/6terKyu/NeWaza/YokoShioGatame.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NeWaza/YokoShioGatame.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NeWaza/TateShioGatame.webm" url: "videos/6terKyu/NeWaza/TateShioGatame.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NeWaza/TateShioGatame.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/NeWaza/TateShioGatame.webm" url: "videos/6terKyu/NeWaza/TateShioGatame.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/NeWaza/TateShioGatame.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungTachiWaza/IpponSeoiNage.webm" url: "videos/6terKyu/AnwendungTachiWaza/IpponSeoiNage.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungTachiWaza/IpponSeoiNage.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungTachiWaza/TaiOtoshi.webm" url: "videos/6terKyu/AnwendungTachiWaza/TaiOtoshi.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungTachiWaza/TaiOtoshi.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungTachiWaza/KoUchiGari.webm" url: "videos/6terKyu/AnwendungTachiWaza/KoUchiGari.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungTachiWaza/KoUchiGari.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungTachiWaza/DeAshiBarei.webm" url: "videos/6terKyu/AnwendungTachiWaza/DeAshiBarei.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungTachiWaza/DeAshiBarei.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungTachiWaza/Ausweichen.webm" url: "videos/6terKyu/AnwendungTachiWaza/Ausweichen.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungTachiWaza/Ausweichen.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungNeWaza/OUchiGari.webm" url: "videos/6terKyu/AnwendungNeWaza/OUchiGari.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungNeWaza/OUchiGari.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungNeWaza/KoUchiGari.webm" url: "videos/6terKyu/AnwendungNeWaza/KoUchiGari.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungNeWaza/KoUchiGari.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.webm" url: "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.webm" url: "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungNeWaza/Befreiungsprinzipien.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -4,6 +4,10 @@ video:
url: "videos/6terKyu/AnwendungNeWaza/AngriffUnterlage.webm" url: "videos/6terKyu/AnwendungNeWaza/AngriffUnterlage.webm"
width: 854 width: 854
height: 480 height: 480
poster:
url: "videos/6terKyu/AnwendungNeWaza/AngriffUnterlage.jpg"
width: 854
height: 480
--- ---
## Stichpunkte ## Stichpunkte

View File

@@ -1,13 +1,9 @@
--- ---
title: "Im Stand-Randori die erlernten Würfe kontrolliert werfen und bei Wurfversuchen sich durch Ausweichen verteidigen. Im Boden-Randori nachweisen, dass man einen sich ernsthaft verteidigenden Partner mit Haltegriff kontrollieren kann." title: "Im Stand-Randori die erlernten Würfe kontrolliert werfen und bei Wurfversuchen sich durch Ausweichen verteidigen. Im Boden-Randori nachweisen, dass man einen sich ernsthaft verteidigenden Partner mit Haltegriff kontrollieren kann."
video:
url: "videos/6terKyu/AnwendungNeWaza/AngriffUnterlage.webm"
width: 854
height: 480
--- ---
Die Gesamtzeit für das Prüfungsfach Randori sollte mit mehrfachem Partnerwechsel 10 Minuten nicht überschreiten. Die beim Randori übenden Judoka sollen: Die Gesamtzeit für das Prüfungsfach Randori sollte mit mehrfachem Partnerwechsel 10 Minuten nicht überschreiten. Die beim Randori übenden Judoka sollen:
- *nicht* mit den Armen sperren, *sondern* lockere, gebeugte Arme und einen aufrechten Kampfstiel zeigen ("schönes Judo") - *nicht* mit den Armen sperren, *sondern* lockere, gebeugte Arme und einen aufrechten Kampfstil zeigen ("schönes Judo")
- *nicht* ausschließlich verteidigen, *sondern* auch entschlossen angreifen und zu werfen versuchen - *nicht* ausschließlich verteidigen, *sondern* auch entschlossen angreifen und zu werfen versuchen
- *nicht* nur die Rolle von Tori demonstrieren, *sondern* auch entschlossen angreifen und zu werfen versuchen - *nicht* nur die Rolle von Tori demonstrieren, *sondern* auch entschlossen angreifen und zu werfen versuchen
- am Boden *nicht* nur spielerisch miteinander raufen, *sondern* mit größeren Widerständen als im Stand auch das Kämpfen gegeneinander erproben. - am Boden *nicht* nur spielerisch miteinander raufen, *sondern* mit größeren Widerständen als im Stand auch das Kämpfen gegeneinander erproben.