diff --git a/main.go b/main.go index f60890a..90e62bb 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,8 @@ import ( "log" "os" "server/server" + cmd "server/server/terminal_cmd" + api "server/server/api" ) func main() { @@ -23,20 +25,20 @@ func main() { break } if rep == "vfolder" { - server.ChangeVFolder(&cfg) + cmd.ChangeVFolder(&cfg) fmt.Printf("After change : %+v\n", cfg) continue } if rep == "list" { - server.TakeFolder(&cfg) + cmd.TakeFolder(&cfg) continue } if rep == "config" { - server.ViewConfig(cfg) + cmd.ViewConfig(cfg) continue } if rep == "start" && cfg.StartStatut == 0 { - go server.SimpleHost(cfg) + go api.SimpleHost(cfg) cfg.StartStatut = 1 continue } diff --git a/server/api/core.go b/server/api/core.go new file mode 100644 index 0000000..8e5cddf --- /dev/null +++ b/server/api/core.go @@ -0,0 +1,19 @@ +package api + +import ( + "fmt" + "net/http" + + srv "server/server" +) + +func SimpleHost(cfg srv.Conf) { + RequestFolder(cfg) // For take folder + RequestFile(cfg) // take file + + fmt.Println("API lancer") + err := http.ListenAndServe(":8000", nil) + if err != nil { + fmt.Println("error server") + } +} \ No newline at end of file diff --git a/server/api/request_file.go b/server/api/request_file.go new file mode 100644 index 0000000..09c1439 --- /dev/null +++ b/server/api/request_file.go @@ -0,0 +1,27 @@ +package api + +import ( + "net/http" + "path/filepath" + + srv "server/server" +) + +func RequestFile(cfg srv.Conf) { + http.HandleFunc("/api/video/{filename}", func(w http.ResponseWriter, r *http.Request) { + // Allow the frontend dev server to stream video from this API. + w.Header().Set("Access-Control-Allow-Origin", "http://localhost:5173") + w.Header().Set("Access-Control-Allow-Methods", "GET, OPTIONS") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Range") + w.Header().Set("Access-Control-Expose-Headers", "Accept-Ranges, Content-Length, Content-Range") + + if r.Method == http.MethodOptions { + w.WriteHeader(http.StatusNoContent) + return + } + + filename := r.PathValue("filename") + videoPath := filepath.Join(cfg.Path, cfg.Folder.VideoF, filename) + http.ServeFile(w, r, videoPath) + }) +} diff --git a/server/server_request.go b/server/api/request_folder.go similarity index 88% rename from server/server_request.go rename to server/api/request_folder.go index 486e72d..e214c6b 100644 --- a/server/server_request.go +++ b/server/api/request_folder.go @@ -1,10 +1,12 @@ -package server +package api import ( "encoding/json" "fmt" "net/http" "os" + + srv "server/server" ) type Item struct { @@ -22,7 +24,7 @@ var items = []Item{ {ID: 2, Name: "Item B"}, } -func SearchInFolder() ([]Folder) { +func SearchInFolder() []Folder { entries, err := os.ReadDir(".") if err != nil { return nil @@ -41,6 +43,7 @@ func SearchInFolder() ([]Folder) { return folders } + func itemsHandler(w http.ResponseWriter, r *http.Request) { // Allow the Vite dev server to read API responses from the browser. w.Header().Set("Access-Control-Allow-Origin", "http://localhost:5173") @@ -66,11 +69,6 @@ func itemsHandler(w http.ResponseWriter, r *http.Request) { } } -func SimpleHost(cfg conf) { +func RequestFolder(cfg srv.Conf) { http.HandleFunc("/", itemsHandler) - fmt.Println("API lancer") - err := http.ListenAndServe(":8000", nil) - if err != nil { - fmt.Println("error server") - } } diff --git a/server/server.go b/server/server.go index 3fc7350..be3ed77 100644 --- a/server/server.go +++ b/server/server.go @@ -14,14 +14,16 @@ type conf struct { WebtoonF string `toml:"webtoon_f"` } `toml:"folder"` Server struct { - Port int `toml:"port"` + Port int `toml:"port"` Host string `toml:"host"` } `toml:"server"` - Path string + Path string StartStatut int } -func LoadConf(path string) (conf, error) { +type Conf = conf + +func LoadConf(path string) (Conf, error) { var cfg conf _, err := toml.DecodeFile(path, &cfg) cfg.Path, err = os.Getwd() @@ -29,7 +31,7 @@ func LoadConf(path string) (conf, error) { return cfg, err } -func ServerStart() conf { +func ServerStart() Conf { cfg, err := LoadConf("config/config.toml") if err != nil { log.Fatalf("error toml") diff --git a/server/command_server.go b/server/terminal_cmd/command_server.go similarity index 74% rename from server/command_server.go rename to server/terminal_cmd/command_server.go index bee6610..ac36e69 100644 --- a/server/command_server.go +++ b/server/terminal_cmd/command_server.go @@ -1,24 +1,26 @@ -package server +package cmd import ( "fmt" "os" + + srv "server/server" ) -func ChangeVFolder(cfg *conf) { +func ChangeVFolder(cfg *srv.Conf) { var ChangePath string fmt.Println("Quelle est le nouveau path ?") fmt.Scan(&ChangePath) cfg.Folder.VideoF = ChangePath } -func TakeFolder(cfg *conf) { +func TakeFolder(cfg *srv.Conf) { fmt.Printf("Path : %v\n", cfg.Path) - folder, _ := os.ReadDir(cfg.Folder.VideoF) + folder, _ := os.ReadDir(cfg.Folder.VideoF) fmt.Printf("%+v\n", folder) } -func ViewConfig(cfg conf) { +func ViewConfig(cfg srv.Conf) { fmt.Println("\t\tCONFIG") fmt.Println("Serveur :") fmt.Printf(" - Port : %v\n", cfg.Server.Port) @@ -26,4 +28,4 @@ func ViewConfig(cfg conf) { fmt.Println("Folders :") fmt.Printf(" - Folder for videos : %v\n", cfg.Folder.VideoF) fmt.Printf(" - Folder for Webtoon : %v\n", cfg.Folder.WebtoonF) -} \ No newline at end of file +} diff --git a/web-client/index.html b/web-client/index.html index a7160cd..e594afe 100644 --- a/web-client/index.html +++ b/web-client/index.html @@ -8,6 +8,6 @@
- + diff --git a/web-client/src/App.jsx b/web-client/src/App.tsx similarity index 99% rename from web-client/src/App.jsx rename to web-client/src/App.tsx index 8c5fe9d..9469aed 100644 --- a/web-client/src/App.jsx +++ b/web-client/src/App.tsx @@ -1,3 +1,4 @@ +// @ts-nocheck import { useEffect, useState, useRef } from 'react' import './App.css' import { Navigate, useNavigate } from 'react-router-dom' diff --git a/web-client/src/assets/camera.png b/web-client/src/assets/camera.png new file mode 100644 index 0000000..c6f1dcb Binary files /dev/null and b/web-client/src/assets/camera.png differ diff --git a/web-client/src/assets/filmclair.png b/web-client/src/assets/filmclair.png new file mode 100644 index 0000000..3eebfed Binary files /dev/null and b/web-client/src/assets/filmclair.png differ diff --git a/web-client/src/assets/homelogo.png b/web-client/src/assets/homelogo.png new file mode 100644 index 0000000..d2bb3c9 Binary files /dev/null and b/web-client/src/assets/homelogo.png differ diff --git a/web-client/src/assets/maisonclair.png b/web-client/src/assets/maisonclair.png new file mode 100644 index 0000000..31b10ac Binary files /dev/null and b/web-client/src/assets/maisonclair.png differ diff --git a/web-client/src/connection.jsx b/web-client/src/connection.jsx deleted file mode 100644 index 605d4a7..0000000 --- a/web-client/src/connection.jsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from "react"; -import { useNavigate } from 'react-router-dom' - -export default function LoginPage() { - const navigate = useNavigate() - const items = [ - { label: 'Acceuil', linkp: '/', type: 'internal' }, - { label: 'Github', linkp: 'https://github.com/Tadomika-Ari/MIRA-Stream', type: 'external' }, - ] - return ( -
-
- - MIRA Stream - - - -
-
- hello word -
-
- ); -} \ No newline at end of file diff --git a/web-client/src/main.jsx b/web-client/src/main.tsx similarity index 83% rename from web-client/src/main.jsx rename to web-client/src/main.tsx index 8be778f..620007c 100644 --- a/web-client/src/main.jsx +++ b/web-client/src/main.tsx @@ -1,9 +1,10 @@ +// @ts-nocheck import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import { BrowserRouter, Routes, Route } from 'react-router-dom' import './index.css' -import App from './App.jsx' -import Conn from './connection.jsx' +import App from './App.tsx' +import Conn from './pages/connection.tsx' createRoot(document.getElementById('root')).render( diff --git a/web-client/src/pages/connection.tsx b/web-client/src/pages/connection.tsx new file mode 100644 index 0000000..7e96bfc --- /dev/null +++ b/web-client/src/pages/connection.tsx @@ -0,0 +1,129 @@ +// @ts-nocheck +import React from "react"; +import { useEffect, useState } from "react"; +import { useNavigate } from 'react-router-dom' +import homelogo from '../assets/maisonclair.png' +import cameralogo from '../assets/filmclair.png' + +const folderIcon = ( + +) + +const fileIcon = ( + +) + +export default function LoginPage() { + + const [explorerItems, setExplorerItems] = useState([]) + const [loading, setLoading] = useState(true) + const [error, setError] = useState('') + + const navigate = useNavigate() + + const items = [ + { label: 'Acceuil', linkp: '/', type: 'internal' }, + { label: 'Github', linkp: 'https://github.com/Tadomika-Ari/MIRA-Stream', type: 'external' }, + ] + + const loadExplorerItems = async () => { + try { + setLoading(true) + setError('') + + const res = await fetch('http://localhost:8000/') + if (!res.ok) throw new Error(`HTTP ${res.status}`) + + const data = await res.json() + setExplorerItems(Array.isArray(data) ? data : []) + } catch (err) { + console.error('Erreur requĂȘte:', err) + setExplorerItems([]) + setError("Impossible de charger le dossier.") + } finally { + setLoading(false) + } + } + + useEffect(() => { + loadExplorerItems() + }, []) + + const renderIcon = (type) => (type === 'dir' ? folderIcon : fileIcon) + const filename = 'Arifureta.mp4' + return ( +
+
+ + MIRA Stream + + + +
+
+ Logo accueil navigate('/')} className="h-15 w-15 object-contain mx-2" /> + Logo Film +
+
+
+
+

Explorateur

+ + {loading ? ( +

Chargement du dossier...

+ ) : error ? ( +

{error}

+ ) : ( +
    + {explorerItems.map((item) => ( +
  • + {renderIcon(item.type)} + {item.name} +
  • + ))} +
+ )} +
+
+
+ +
+
+
+ ); +}