Primera prueba de gui

This commit is contained in:
Ales (Shagi) Zabala Alava 2020-02-16 16:49:10 +01:00
parent d222ca7133
commit 387ea6d91d
3 changed files with 247 additions and 0 deletions

BIN
gui/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

178
gui/karaoke.py Normal file
View File

@ -0,0 +1,178 @@
import json
import subprocess
import sys
from pathlib import Path
import kivy
kivy.require('1.11.1')
from kivy.app import App
from kivy.core.window import Window
from kivy.properties import StringProperty, ObjectProperty, ListProperty, BooleanProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.widget import Widget
class Song(BoxLayout):
active = BooleanProperty(False)
path = ObjectProperty('')
def on_path(self, instance, value):
self.search_media()
def search_media(self):
self.name = self.path.name
self.original = None
self.author = None
self.video = None
self.video_type = None
self.vtt = None
self.srt = None
self.ass = None
self.cover = None
self.thumbnail = None
self.files = []
for entry in self.path.iterdir():
if entry.name == 'metadata.json':
with entry.open('r') as metadatafile:
self.metadata = json.load(metadatafile)
if 'name' in self.metadata:
self.name = self.metadata['name']
if 'original' in self.metadata:
self.original = self.metadata['original']
if 'author' in self.metadata:
self.author = self.metadata['author']
elif entry.name.endswith('mp4'):
self.video = str(entry)
self.video_type = 'video/mp4'
elif entry.name.endswith('webm'):
self.video = str(entry)
self.video_type = 'video/webm'
elif entry.name.endswith('ogv'):
self.video = str(entry)
self.video_type = 'video/ogg'
elif entry.name.endswith('vtt'):
self.vtt = str(entry)
elif entry.name == "{}.srt".format(self.path.name):
self.srt = str(entry)
elif entry.name.endswith('ass'):
self.ass = str(entry)
elif entry.name == 'thumb.jpg':
self.thumbnail = str(entry)
elif entry.name.endswith('jpg'):
self.cover = str(entry)
elif entry.name == 'index.html':
continue
@property
def publish(self):
return self.video and self.subtitle
@property
def subtitle(self):
return self.ass or self.srt or self.vtt
class KaraokeGUI(BoxLayout):
active_song = ObjectProperty(None)
songs = ListProperty([])
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.keyboard = Window.request_keyboard(
self.keyboard_closed,
self,
'text',
)
self.keyboard.bind(on_key_down=self.on_key_down)
def on_key_down(self, keyboard, keycode, text, modifiers):
if text == 'a':
self.previous()
return True
elif text == 'd':
self.next()
return True
elif text == 's':
self.play()
return True
return False
def keyboard_closed(self):
pass
def on_songs(self, instance, value):
container = self.ids['song_container']
container.clear_widgets()
for song in self.songs:
container.add_widget(song)
self.active_song = self.songs[0]
def on_active_song(self, instance, value):
for song in self.songs:
song.active = False
value.active = True
current_song_image = self.ids['current_song_image']
current_song_image.source = value.cover
scrollview = self.ids['songs_scroll']
scrollview.scroll_to(value)
def previous(self):
idx = self.songs.index(self.active_song)
if idx > 0:
idx -= 1
else:
idx = len(self.songs) - 1
self.active_song = self.songs[idx]
def next(self):
idx = self.songs.index(self.active_song)
if idx < len(self.songs) - 1:
idx += 1
else:
idx = 0
self.active_song = self.songs[idx]
def play(self):
subprocess.call([
'vlc',
'--fullscreen',
'--sub-file',
self.active_song.subtitle,
self.active_song.video,
'vlc://quit'
])
class KaraokeApp(App):
kv_directory = 'kv_templates'
def __init__(self, root_folder, **kwargs):
super().__init__(**kwargs)
self.root_folder = root_folder
def build(self):
super().build()
songs = []
container = self.root.ids['song_container']
for entry in self.root_folder.iterdir():
if entry.is_dir():
song = Song(
path=entry,
)
if song.publish:
songs.append(song)
self.root.songs = songs
return self.root
if __name__ == '__main__':
Window.fullscreen = True
KaraokeApp(Path(sys.argv[1])).run()

View File

@ -0,0 +1,69 @@
KaraokeGUI:
<Song>:
size_hint: None, None
size: 200, 200
orientation: 'vertical'
padding: 0
spacing: 0
canvas.before:
Color:
rgb: 0.9, 0.9, 0.9 if self.active else 0.3, 0.3, 0.3
Line:
rectangle: self.pos[0], self.pos[1], self.size[0], self.size[1]
Image:
source: self.parent.thumbnail
size_hint: 1, 0.8
Label:
canvas.before:
Color:
rgb: 0.3, 0.3, 0.3
Rectangle:
pos: self.pos
size: self.size
size_hint: 1, 0.1
text: self.parent.name
<KaraokeGUI>:
orientation: 'vertical'
Image:
id: current_song_image
source: ''
Button:
text: '>'
on_press: root.play()
size_hint: 1, 0.1
BoxLayout:
orientation: 'horizontal'
height: 220
size_hint: 1, None
Button:
size_hint: None, None
size: 20, 220
text: '<'
on_press: root.previous()
ScrollView:
id: songs_scroll
do_scroll_x: True
do_scroll_y: False
size_hint: 1, None
height: 220
GridLayout:
id: song_container
rows: 1
width: self.minimum_width
padding: 10
spacing: 10
size_hint: None, 1
Button:
size_hint: None, None
size: 20, 220
text: '>'
on_press: root.next()