Compare commits
2 Commits
3313298fa2
...
feb00df8c5
Author | SHA1 | Date | |
---|---|---|---|
|
feb00df8c5 | ||
|
5611f134e3 |
6
open_workout_coach/__init__.py
Normal file
6
open_workout_coach/__init__.py
Normal file
@ -0,0 +1,6 @@
|
||||
from . import (
|
||||
load_exercises,
|
||||
map_yaml_to_database,
|
||||
create_open_workout_database,
|
||||
exercise_config
|
||||
)
|
27
open_workout_coach/__main__.py
Normal file
27
open_workout_coach/__main__.py
Normal file
@ -0,0 +1,27 @@
|
||||
import click
|
||||
|
||||
from open_workout_coach.load_exercises import load_file_and_media_links
|
||||
from open_workout_coach.map_yaml_to_database import process_config_into_workout_file
|
||||
|
||||
|
||||
@click.group("cli")
|
||||
def cli():
|
||||
pass
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('input_path', type=click.Path(exists=True))
|
||||
@click.argument('output_destination', type=click.Path(exists=True))
|
||||
def create_plan(input_path, output_destination):
|
||||
"""
|
||||
Creates a openworkout plan from the input yaml file.
|
||||
"""
|
||||
config = load_file_and_media_links(file_path=input_path)
|
||||
process_config_into_workout_file(config=config, output_destination=output_destination)
|
||||
|
||||
|
||||
FILE = 'data/input/samples/exercises.yaml'
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
cli()
|
0
open_workout_coach/cli.py
Normal file
0
open_workout_coach/cli.py
Normal file
@ -69,8 +69,12 @@ def get_item_id():
|
||||
start += 1
|
||||
|
||||
|
||||
def create_item(name, workout_time, n_repetitions, description=None, preparation_time=5, video_path=None):
|
||||
def create_item(
|
||||
name, workout_time=30, n_repetitions=None, description=None,
|
||||
preparation_time=5, video_path=None, break_time=5
|
||||
):
|
||||
is_video_mode = True if video_path else False
|
||||
is_time_mode = False if n_repetitions else True
|
||||
|
||||
new_item = dict(WOPRKOUT_ITEM)
|
||||
new_item_content = {
|
||||
@ -79,13 +83,14 @@ def create_item(name, workout_time, n_repetitions, description=None, preparation
|
||||
'elapsedTime': 0,
|
||||
'imagePath': '',
|
||||
'isImagePathExternal': False,
|
||||
'isTimeMode': True,
|
||||
'isTimeMode': is_time_mode,
|
||||
'isVideoMode': is_video_mode,
|
||||
'prepTime': preparation_time,
|
||||
'repetitionCount': n_repetitions,
|
||||
'videoPath': video_path,
|
||||
"orderNr": next(get_item_id()),
|
||||
"workoutItemId": 0,
|
||||
"breakTime": break_time,
|
||||
"workoutSessionId": 1,
|
||||
'workoutTime': workout_time
|
||||
}
|
@ -13,6 +13,7 @@ def get_video(url):
|
||||
return output_dir
|
||||
|
||||
|
||||
@lru_cache(5)
|
||||
def create_gif_from_video_and_timestamps(video_path, start, end):
|
||||
video = mpy.VideoFileClip(video_path)
|
||||
clip: mpy.VideoFileClip = video.subclip(start, end)
|
||||
@ -29,7 +30,6 @@ def load_file_and_media_links(file_path):
|
||||
video_url = ex['video']
|
||||
start = ex['start']
|
||||
end = ex['end']
|
||||
|
||||
video_path = get_video(video_url)
|
||||
gif = create_gif_from_video_and_timestamps(video_path, start, end)
|
||||
ex['gif_path'] = gif
|
@ -3,8 +3,7 @@ import tempfile
|
||||
import zipfile
|
||||
import os
|
||||
|
||||
from load_exercises import load_file_and_media_links
|
||||
from create_open_workout_database import create_workout_session, create_item, create_workout_database
|
||||
from open_workout_coach.create_open_workout_database import create_workout_session, create_item, create_workout_database
|
||||
|
||||
|
||||
ITEM_KEY_MEDIA_TYPE_MAP = {
|
||||
@ -85,37 +84,29 @@ def map_config_to_workout_file(config):
|
||||
items = [
|
||||
create_item(
|
||||
name=item['name'],
|
||||
workout_time=30,
|
||||
n_repetitions=1,
|
||||
description=None,
|
||||
preparation_time=5,
|
||||
video_path=item['gif_path']
|
||||
workout_time=item.get('duration'),
|
||||
n_repetitions=item.get('repetitions'),
|
||||
description=item.get('description'),
|
||||
preparation_time=item.get('preparation'),
|
||||
break_time=item.get('break'),
|
||||
video_path=item.get('gif_path')
|
||||
)
|
||||
for item in config['exercises']
|
||||
]
|
||||
sessions = [create_workout_session(items)] * 30
|
||||
sessions = [create_workout_session(items)] * config['n_sessions']
|
||||
db = create_workout_database(config['name'], sessions)
|
||||
return db
|
||||
|
||||
|
||||
def process_config_into_workout_file(config, output_file = None):
|
||||
def process_config_into_workout_file(config, output_destination = None):
|
||||
db = map_config_to_workout_file(config)
|
||||
videos = get_all_media_from_db_by_type(db, media_type='video')
|
||||
images = get_all_media_from_db_by_type(db, media_type='image')
|
||||
db = refactor_media_paths_in_db(db)
|
||||
|
||||
output_file_name = output_file or f"{db['name']}.zip"
|
||||
output_file_name = f"{output_destination or '.'}/{db['name']}.zip"
|
||||
save_workout_file(
|
||||
output_files=output_file_name,
|
||||
db_file=db,
|
||||
video_files=videos,
|
||||
)
|
||||
|
||||
|
||||
FILE = 'data/input/samples/exercises.yaml'
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
config = load_file_and_media_links(FILE)
|
||||
process_config_into_workout_file(config)
|
||||
|
17
readme.md
17
readme.md
@ -3,15 +3,16 @@ Creates a workout plan form an yaml file that can be imported to <img src="https
|
||||
|
||||
Inputs can be of format
|
||||
```yaml
|
||||
name: name of workout plan
|
||||
n_sessions: 1
|
||||
exercises:
|
||||
- name: nomoney
|
||||
video: "https://www.youtube.com/watch?v=etAwQ4jzyNY"
|
||||
start: 74
|
||||
end: 80
|
||||
- name: plank shoulder tap
|
||||
video: "https://www.youtube.com/watch?v=etAwQ4jzyNY"
|
||||
start: 113
|
||||
end: 116
|
||||
- name: Shoulder Stretch (Up-Left)
|
||||
start: 209
|
||||
end: 212
|
||||
video: https://www.youtube.com/watch?v=TSIbzfcnv_8
|
||||
break: 0
|
||||
duration: 10
|
||||
preparation: 3
|
||||
```
|
||||
|
||||
The script will download the video and create short clips.
|
@ -2,3 +2,5 @@ pyyaml
|
||||
pytube
|
||||
moviepy
|
||||
imageio
|
||||
ffmpeg-python
|
||||
click
|
||||
|
Loading…
x
Reference in New Issue
Block a user