main data

This commit is contained in:
2025-03-19 16:52:03 +02:00
commit 48f1dc2a77
15 changed files with 356 additions and 0 deletions

Binary file not shown.

Binary file not shown.

1
src/assets/images Normal file
View File

@@ -0,0 +1 @@
This file is intentionally left blank.

1
src/assets/videos Normal file
View File

@@ -0,0 +1 @@
# This directory is intended to contain video files for the media player application.

BIN
src/instance/dashboard.db Normal file

Binary file not shown.

45
src/kv/main.kv Normal file
View File

@@ -0,0 +1,45 @@
<contents of /kivy-media-player/kivy-media-player/src/kv/main.kv>
<ScreenManager>:
MainScreen:
SettingsScreen:
<MainScreen>:
name: 'main'
BoxLayout:
orientation: 'vertical'
Label:
text: 'Welcome to the Media Player'
font_size: 32
size_hint_y: None
height: 50
Button:
text: 'Go to Settings'
on_press: root.manager.current = 'settings'
Button:
text: 'Play Media'
on_press: app.play_media()
<SettingsScreen>:
name: 'settings'
BoxLayout:
orientation: 'vertical'
Label:
text: 'Settings'
font_size: 32
size_hint_y: None
height: 50
TextInput:
id: quick_connect_code
hint_text: 'Enter Quick Connect Code'
multiline: False
TextInput:
id: server_ip
hint_text: 'Enter Server IP or Domain'
multiline: False
Button:
text: 'Save Settings'
on_press: app.save_settings(quick_connect_code.text, server_ip.text)
Button:
text: 'Back to Main'
on_press: root.manager.current = 'main'

52
src/kv/media_player.kv Normal file
View File

@@ -0,0 +1,52 @@
<contents of /kivy-media-player/kivy-media-player/src/kv/media_player.kv>
<MediaPlayerScreen>:
name: 'media_player'
BoxLayout:
orientation: 'vertical'
Video:
id: video_player
state: 'stop'
options: {'eos': 'stop'}
BoxLayout:
size_hint_y: None
height: '50dp'
Button:
text: 'Play'
on_press: root.play_video()
Button:
text: 'Pause'
on_press: root.pause_video()
Button:
text: 'Stop'
on_press: root.stop_video()
Button:
text: 'Next'
on_press: root.next_video()
Image:
id: image_display
allow_stretch: True
keep_ratio: True
size_hint_y: None
height: '300dp'
Label:
id: playlist_label
text: 'Playlist'
size_hint_y: None
height: '30dp'
ScrollView:
size_hint_y: None
height: '200dp'
GridLayout:
id: playlist
cols: 1
size_hint_y: None
height: self.minimum_height
<MediaPlayerScreen>:
on_enter: root.load_playlist()

32
src/kv/settings.kv Normal file
View File

@@ -0,0 +1,32 @@
<settings.kv>
<SettingsScreen>:
BoxLayout:
orientation: 'vertical'
padding: 10
spacing: 10
Label:
text: 'Settings'
font_size: 24
size_hint_y: None
height: 40
Label:
text: 'Quick Connect Code:'
TextInput:
id: quick_connect_code
multiline: False
Label:
text: 'Server IP/Domain Name:'
TextInput:
id: server_ip
multiline: False
Button:
text: 'Save Settings'
on_press: app.save_settings(quick_connect_code.text, server_ip.text)
Button:
text: 'Back to Main'
on_press: app.change_screen('main')

21
src/main.py Normal file
View File

@@ -0,0 +1,21 @@
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from settings import Settings
from media_player import MediaPlayer
class MainApp(App):
def build(self):
self.title = "Kivy Media Player"
self.sm = ScreenManager()
self.sm.add_widget(Settings(name='settings'))
self.sm.add_widget(MediaPlayer(name='media_player'))
Clock.schedule_interval(self.check_playlist_updates, 300) # Check for updates every 5 minutes
return self.sm
def check_playlist_updates(self, dt):
# Logic to check for updates in the playlist
pass
if __name__ == '__main__':
MainApp().run()

64
src/media_player.py Normal file
View File

@@ -0,0 +1,64 @@
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.uix.video import Video
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
import requests
import os
import json
class MediaPlayer(Screen):
def __init__(self, **kwargs):
super(MediaPlayer, self).__init__(**kwargs)
self.playlist = []
self.current_index = 0
self.video_player = Video()
self.image_display = Image()
self.layout = BoxLayout(orientation='vertical')
self.layout.add_widget(self.video_player)
self.layout.add_widget(self.image_display)
self.add_widget(self.layout)
Clock.schedule_interval(self.check_playlist_updates, 300) # Check for updates every 5 minutes
def on_enter(self):
self.load_playlist()
self.play_media()
def load_playlist(self):
# Load playlist from the server or local storage
try:
response = requests.get('http://yourserver.com/api/playlist')
response.raise_for_status() # Raise an exception for HTTP errors
self.playlist = response.json()
except requests.exceptions.RequestException as e:
print(f"Failed to load playlist: {e}")
except json.JSONDecodeError:
print("Failed to parse playlist JSON")
def play_media(self):
if self.playlist:
media = self.playlist[self.current_index]
if media['type'] == 'video':
self.video_player.source = media['url']
self.video_player.play()
self.image_display.source = ''
elif media['type'] == 'image':
self.image_display.source = media['url']
self.video_player.source = ''
self.image_display.reload()
def check_playlist_updates(self, dt):
self.load_playlist()
self.play_media()
class MediaPlayerApp(App):
def build(self):
Window.fullscreen = True
sm = ScreenManager()
sm.add_widget(MediaPlayer(name='media_player'))
return sm
if __name__ == '__main__':
MediaPlayerApp().run()

1
src/settings.json Normal file
View File

@@ -0,0 +1 @@
{"settings": {"quick_connect_code": "", "server_ip": ""}}

51
src/settings.py Normal file
View File

@@ -0,0 +1,51 @@
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.properties import StringProperty
from kivy.storage.jsonstore import JsonStore
class Settings(Screen):
quick_connect_code = StringProperty("")
server_ip = StringProperty("")
def __init__(self, **kwargs):
super(Settings, self).__init__(**kwargs)
self.store = JsonStore('settings.json')
self.load_settings()
self.layout = BoxLayout(orientation='vertical')
self.server_ip_input = TextInput(hint_text='Server IP or Domain')
self.quick_connect_code_input = TextInput(hint_text='Quick Connect Code')
self.layout.add_widget(Label(text='Server IP or Domain:'))
self.layout.add_widget(self.server_ip_input)
self.layout.add_widget(Label(text='Quick Connect Code:'))
self.layout.add_widget(self.quick_connect_code_input)
self.save_button = Button(text='Save', on_press=self.save_settings)
self.layout.add_widget(self.save_button)
self.add_widget(self.layout)
def load_settings(self):
if self.store.exists('settings'):
settings = self.store.get('settings')
self.quick_connect_code = settings.get('quick_connect_code', "")
self.server_ip = settings.get('server_ip', "")
def save_settings(self, instance=None):
self.store.put('settings', quick_connect_code=self.quick_connect_code, server_ip=self.server_ip)
server_ip = self.server_ip_input.text
quick_connect_code = self.quick_connect_code_input.text
# Save the settings (e.g., to a file or database)
print(f'Settings saved: Server IP = {server_ip}, Quick Connect Code = {quick_connect_code}')
def on_quick_connect_code(self, instance, value):
self.save_settings()
def on_server_ip(self, instance, value):
self.save_settings()

29
src/utils.py Normal file
View File

@@ -0,0 +1,29 @@
def download_file(url, destination):
import requests
response = requests.get(url)
if response.status_code == 200:
with open(destination, 'wb') as f:
f.write(response.content)
return True
return False
def check_for_playlist_updates(playlist_url, current_playlist):
import requests
response = requests.get(playlist_url)
if response.status_code == 200:
new_playlist = response.json()
if new_playlist != current_playlist:
return new_playlist
return None
def schedule_playlist_update(playlist_url, current_playlist, update_interval=300):
from threading import Timer
def check_updates():
new_playlist = check_for_playlist_updates(playlist_url, current_playlist)
if new_playlist:
current_playlist.clear()
current_playlist.extend(new_playlist)
Timer(update_interval, check_updates).start()
check_updates()