new logo,
partly implement tvshow reindex * add tvshow to db * add episodes to db new route switcher for tvshows
This commit is contained in:
		@@ -1,7 +1,123 @@
 | 
			
		||||
package videoparser
 | 
			
		||||
 | 
			
		||||
import "openmediacenter/apiGo/api/types"
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"openmediacenter/apiGo/api/types"
 | 
			
		||||
	"openmediacenter/apiGo/database"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func startTVShowReindex(files []Show, sett types.SettingsType) {
 | 
			
		||||
	// have fun with db insertions here!
 | 
			
		||||
 | 
			
		||||
	allTVshows := getAllTVShows()
 | 
			
		||||
 | 
			
		||||
	for _, file := range files {
 | 
			
		||||
		// insert new TVShow entry if not existing.
 | 
			
		||||
		insertShowIfNotExisting(file, allTVshows)
 | 
			
		||||
 | 
			
		||||
		insertEpisodesIfNotExisting(file)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func insertEpisodesIfNotExisting(show Show) {
 | 
			
		||||
	query := fmt.Sprintf("SELECT tvshow_episodes.name, season, episode FROM tvshow_episodes JOIN tvshow t on t.id = tvshow_episodes.tvshow_id WHERE t.name='%s'", show.Name)
 | 
			
		||||
	rows := database.Query(query)
 | 
			
		||||
 | 
			
		||||
	var dbepisodes []string
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		var epname string
 | 
			
		||||
		var season int
 | 
			
		||||
		var episode int
 | 
			
		||||
		err := rows.Scan(&epname, &season, &episode)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println(err.Error())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dbepisodes = append(dbepisodes, fmt.Sprintf("%s S%02dE%02d.mp4", epname, season, episode))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// get those episodes that are missing in db
 | 
			
		||||
	diff := difference(show.files, dbepisodes)
 | 
			
		||||
 | 
			
		||||
	for _, s := range diff {
 | 
			
		||||
		insertEpisode(s, show.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("diff is...")
 | 
			
		||||
	fmt.Println(diff)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func insertEpisode(path string, ShowName string) {
 | 
			
		||||
	seasonRegex := regexp.MustCompile("S[0-9][0-9]")
 | 
			
		||||
	episodeRegex := regexp.MustCompile("E[0-9][0-9]")
 | 
			
		||||
	matchENDPattern := regexp.MustCompile(" S[0-9][0-9]E[0-9][0-9].+$")
 | 
			
		||||
 | 
			
		||||
	seasonStr := seasonRegex.FindString(path)[1:]
 | 
			
		||||
	episodeStr := episodeRegex.FindString(path)[1:]
 | 
			
		||||
	extString := matchENDPattern.FindString(path)
 | 
			
		||||
	name := strings.TrimSuffix(path, extString)
 | 
			
		||||
 | 
			
		||||
	season, err := strconv.ParseInt(seasonStr, 10, 8)
 | 
			
		||||
	episode, err := strconv.ParseInt(episodeStr, 10, 8)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	query := fmt.Sprintf(`
 | 
			
		||||
INSERT INTO tvshow_episodes (name, season, poster, tvshow_id, episode)
 | 
			
		||||
VALUES ('%s', %d, '%s', (SELECT tvshow.id FROM tvshow WHERE tvshow.name='%s'), %d)`, name, season, "", ShowName, episode)
 | 
			
		||||
	err = database.Edit(query)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// difference returns the elements in `a` that aren't in `b`.
 | 
			
		||||
func difference(a, b []string) []string {
 | 
			
		||||
	mb := make(map[string]struct{}, len(b))
 | 
			
		||||
	for _, x := range b {
 | 
			
		||||
		mb[x] = struct{}{}
 | 
			
		||||
	}
 | 
			
		||||
	var diff []string
 | 
			
		||||
	for _, x := range a {
 | 
			
		||||
		if _, found := mb[x]; !found {
 | 
			
		||||
			diff = append(diff, x)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return diff
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func insertShowIfNotExisting(show Show, allShows *[]string) {
 | 
			
		||||
	// if show already exists return
 | 
			
		||||
	fmt.Println(*allShows)
 | 
			
		||||
	for _, s := range *allShows {
 | 
			
		||||
		if s == show.Name {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// todo load tmdb pic
 | 
			
		||||
	query := fmt.Sprintf("INSERT INTO tvshow (name, thumbnail) VALUES ('%s', '%s')", show.Name, "")
 | 
			
		||||
	err := database.Edit(query)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getAllTVShows() *[]string {
 | 
			
		||||
	query := "SELECT name FROM tvshow"
 | 
			
		||||
	rows := database.Query(query)
 | 
			
		||||
 | 
			
		||||
	var res []string
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		var show string
 | 
			
		||||
		rows.Scan(&show)
 | 
			
		||||
 | 
			
		||||
		res = append(res, show)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &res
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,10 +29,6 @@ func newChatSender() *ChatSender {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *ChatSender) TestCall() {
 | 
			
		||||
	fmt.Println("hello world")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *ChatSender) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	c, err := websocket.Accept(w, r, &websocket.AcceptOptions{
 | 
			
		||||
		OriginPatterns: []string{"*"},
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 3.1 KiB  | 
@@ -2,14 +2,14 @@
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
 | 
			
		||||
    <link rel="icon" href="%PUBLIC_URL%/logo_circle.png" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1" />
 | 
			
		||||
    <meta name="theme-color" content="#000000" />
 | 
			
		||||
    <meta
 | 
			
		||||
      name="description"
 | 
			
		||||
      content="A Application to run a Mediacenter in your local network"
 | 
			
		||||
    />
 | 
			
		||||
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
 | 
			
		||||
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo_circle.png" />
 | 
			
		||||
    <!--
 | 
			
		||||
      manifest.json provides metadata used when your web app is installed on a
 | 
			
		||||
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 5.2 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 9.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/logo_circle.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/logo_circle.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 25 KiB  | 
@@ -3,6 +3,7 @@ import Preview from '../../elements/Preview/Preview';
 | 
			
		||||
import {APINode, callAPI} from '../../utils/Api';
 | 
			
		||||
import {TVShow} from '../../types/ApiTypes';
 | 
			
		||||
import DynamicContentContainer from '../../elements/DynamicContentContainer/DynamicContentContainer';
 | 
			
		||||
import {Route, Switch, useRouteMatch} from 'react-router-dom';
 | 
			
		||||
 | 
			
		||||
interface State {
 | 
			
		||||
    loading: boolean;
 | 
			
		||||
@@ -26,16 +27,27 @@ class TVShowPage extends React.Component<Props, State> {
 | 
			
		||||
 | 
			
		||||
    render(): JSX.Element {
 | 
			
		||||
        return (
 | 
			
		||||
            <>
 | 
			
		||||
                <DynamicContentContainer
 | 
			
		||||
                    renderElement={(elem): JSX.Element => (
 | 
			
		||||
                        <Preview name={elem.Name} picLoader={(callback): void => callback('')} linkPath={'/tvshows/' + elem.Id} />
 | 
			
		||||
                    )}
 | 
			
		||||
                    data={this.state.loading ? [] : this.data}
 | 
			
		||||
                />
 | 
			
		||||
            </>
 | 
			
		||||
            <DynamicContentContainer
 | 
			
		||||
                renderElement={(elem): JSX.Element => (
 | 
			
		||||
                    <Preview name={elem.Name} picLoader={(callback): void => callback('')} linkPath={'/tvshows/' + elem.Id} />
 | 
			
		||||
                )}
 | 
			
		||||
                data={this.state.loading ? [] : this.data}
 | 
			
		||||
            />
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default TVShowPage;
 | 
			
		||||
export default function (): JSX.Element {
 | 
			
		||||
    let match = useRouteMatch();
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <Switch>
 | 
			
		||||
            <Route path={`${match.path}/:episodeID`}>
 | 
			
		||||
                <div>hey from episode page</div>
 | 
			
		||||
            </Route>
 | 
			
		||||
            <Route path={match.path}>
 | 
			
		||||
                <TVShowPage />
 | 
			
		||||
            </Route>
 | 
			
		||||
        </Switch>
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user