diff --git a/apiGo/api/Helpers.go b/apiGo/api/Helpers.go
index aac7b93..1696c57 100644
--- a/apiGo/api/Helpers.go
+++ b/apiGo/api/Helpers.go
@@ -15,7 +15,8 @@ func readVideosFromResultset(rows *sql.Rows) []types.VideoUnloadedType {
var vid types.VideoUnloadedType
err := rows.Scan(&vid.MovieId, &vid.MovieName)
if err != nil {
- panic(err.Error()) // proper error handling instead of panic in your app
+ fmt.Println(err.Error())
+ return nil
}
result = append(result, vid)
}
diff --git a/apiGo/api/Video.go b/apiGo/api/Video.go
index 9e6c1d2..92b5963 100644
--- a/apiGo/api/Video.go
+++ b/apiGo/api/Video.go
@@ -6,6 +6,8 @@ import (
"net/url"
"openmediacenter/apiGo/api/types"
"openmediacenter/apiGo/database"
+ "openmediacenter/apiGo/database/settings"
+ "os"
"strconv"
)
@@ -423,7 +425,8 @@ func addToVideoHandlers() {
*/
AddHandler("deleteVideo", VideoNode, func(info *HandlerInfo) []byte {
var args struct {
- MovieId int
+ MovieId int
+ FullyDelete bool
}
if err := FillStruct(&args, info.Data); err != nil {
fmt.Println(err.Error())
@@ -443,6 +446,22 @@ func addToVideoHandlers() {
return database.ManualSuccessResponse(err)
}
+ if settings.VideosDeletable() && args.FullyDelete {
+ // get physical path of video to delete
+ query = fmt.Sprintf("SELECT movie_url FROM videos WHERE movie_id=%d", args.MovieId)
+ var vidpath string
+ err := database.QueryRow(query).Scan(&vidpath)
+ if err != nil {
+ return database.ManualSuccessResponse(err)
+ }
+
+ err = os.Remove(vidpath)
+ if err != nil {
+ fmt.Printf("unable to delete file: %s\n", vidpath)
+ }
+ }
+
+ // delete video row from db
query = fmt.Sprintf("DELETE FROM videos WHERE movie_id=%d", args.MovieId)
return database.SuccessQuery(query)
})
diff --git a/apiGo/database/settings/Settings.go b/apiGo/database/settings/Settings.go
index 409a071..d13d305 100644
--- a/apiGo/database/settings/Settings.go
+++ b/apiGo/database/settings/Settings.go
@@ -1,6 +1,7 @@
package settings
var tvShowEnabled bool
+var videosDeletable bool
func TVShowsEnabled() bool {
return tvShowEnabled
@@ -9,3 +10,11 @@ func TVShowsEnabled() bool {
func SetTVShowEnabled(enabled bool) {
tvShowEnabled = enabled
}
+
+func VideosDeletable() bool {
+ return videosDeletable
+}
+
+func SetVideosDeletable(deletable bool) {
+ videosDeletable = deletable
+}
diff --git a/apiGo/main.go b/apiGo/main.go
index 80e138c..9d96e0e 100644
--- a/apiGo/main.go
+++ b/apiGo/main.go
@@ -57,10 +57,12 @@ func handleCommandLineArguments() (*database.DatabaseConfig, bool, *string) {
pathPrefix := flag.String("ReindexPrefix", "/var/www/openmediacenter", "Prefix path for videos to reindex")
disableTVShowSupport := flag.Bool("DisableTVSupport", false, "Disable the TVShow support and pages")
+ videosFullyDeletable := flag.Bool("FullyDeletableVideos", false, "Allow deletion from harddisk")
flag.Parse()
settings2.SetTVShowEnabled(!*disableTVShowSupport)
+ settings2.SetVideosDeletable(*videosFullyDeletable)
return &database.DatabaseConfig{
DBHost: *dbhostPtr,
diff --git a/src/elements/Popups/FullyDeletePopup/FullyDeletePopup.tsx b/src/elements/Popups/FullyDeletePopup/FullyDeletePopup.tsx
new file mode 100644
index 0000000..6c95295
--- /dev/null
+++ b/src/elements/Popups/FullyDeletePopup/FullyDeletePopup.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import PopupBase from '../PopupBase';
+import {Button} from '../../GPElements/Button';
+
+/**
+ * Delete Video popup
+ * can only be rendered once!
+ * @constructor
+ */
+export const FullyDeletePopup = (props: {onSubmit: () => void; onDeny: () => void; onDiscard: () => void}): JSX.Element => {
+ return (
+ <>
+ props.onDiscard()}
+ height='200px'
+ width='350px'
+ ParentSubmit={(): void => {
+ props.onSubmit();
+ }}>
+
+ >
+ );
+};
diff --git a/src/pages/Player/Player.tsx b/src/pages/Player/Player.tsx
index ed4e27e..9b9830e 100644
--- a/src/pages/Player/Player.tsx
+++ b/src/pages/Player/Player.tsx
@@ -21,6 +21,7 @@ import PlyrJS from 'plyr';
import {Button} from '../../elements/GPElements/Button';
import {VideoTypes} from '../../types/ApiTypes';
import GlobalInfos from '../../utils/GlobalInfos';
+import {FullyDeletePopup} from '../../elements/Popups/FullyDeletePopup/FullyDeletePopup';
interface Props extends RouteComponentProps<{id: string}> {}
@@ -35,6 +36,7 @@ interface mystate {
suggesttag: TagType[];
popupvisible: boolean;
actorpopupvisible: boolean;
+ deletepopupvisible: boolean;
actors: ActorType[];
}
@@ -56,6 +58,7 @@ export class Player extends React.Component {
suggesttag: [],
popupvisible: false,
actorpopupvisible: false,
+ deletepopupvisible: false,
actors: []
};
@@ -91,7 +94,7 @@ export class Player extends React.Component {
{
- this.deleteVideo();
+ this.setState({deletepopupvisible: true});
}}
color={{backgroundColor: 'red'}}
/>
@@ -196,6 +199,19 @@ export class Player extends React.Component {
movieId={this.state.movieId}
/>
) : null}
+ {this.state.deletepopupvisible ? (
+ this.setState({deletepopupvisible: false})}
+ onSubmit={(): void => {
+ this.setState({deletepopupvisible: false});
+ this.deleteVideo(true);
+ }}
+ onDeny={(): void => {
+ this.setState({deletepopupvisible: false});
+ this.deleteVideo(false);
+ }}
+ />
+ ) : null}
>
);
}
@@ -325,10 +341,10 @@ export class Player extends React.Component {
/**
* delete the current video and return to last page
*/
- deleteVideo(): void {
+ deleteVideo(fullyDelete: boolean): void {
callAPI(
APINode.Video,
- {action: 'deleteVideo', MovieId: parseInt(this.props.match.params.id, 10)},
+ {action: 'deleteVideo', MovieId: parseInt(this.props.match.params.id, 10), FullyDelete: fullyDelete},
(result: GeneralSuccess) => {
if (result.result === 'success') {
// return to last element if successful