diff --git a/apiGo/api/Video.go b/apiGo/api/Video.go index 69a25fa..8ce169c 100644 --- a/apiGo/api/Video.go +++ b/apiGo/api/Video.go @@ -2,6 +2,7 @@ package api import ( "fmt" + "math/rand" "net/url" "openmediacenter/apiGo/api/api" "openmediacenter/apiGo/api/types" @@ -163,18 +164,25 @@ func getVideoHandlers() { api.AddHandler("getRandomMovies", api.VideoNode, api.PermUser, func(context api.Context) { var args struct { Number int + Seed *int } if api.DecodeRequest(context.GetRequest(), &args) != nil { context.Text("unable to decode request") return } + // if Seed argument not passed generate random seed + if args.Seed == nil { + r := rand.Int() + args.Seed = &r + } + var result struct { Tags []types.Tag Videos []types.VideoUnloadedType } - query := fmt.Sprintf("SELECT movie_id,movie_name FROM videos ORDER BY RAND() LIMIT %d", args.Number) + query := fmt.Sprintf("SELECT movie_id,movie_name FROM videos ORDER BY RAND(%d) LIMIT %d", *args.Seed, args.Number) result.Videos = readVideosFromResultset(database.Query(query)) var ids string diff --git a/src/pages/HomePage/HomePage.test.js b/src/pages/HomePage/HomePage.test.js index b321b3f..9029d16 100644 --- a/src/pages/HomePage/HomePage.test.js +++ b/src/pages/HomePage/HomePage.test.js @@ -90,14 +90,12 @@ describe('', function () { const wrapper = shallow(); // expect those default values - expect(wrapper.state().sortby).toBe('Date Added'); - expect(wrapper.instance().sortState).toBe(SortBy.date); + expect(wrapper.state().sortby).toBe(0); expect(wrapper.instance().tagState).toBe(DefaultTags.all); - wrapper.instance().onDropDownItemClick(SortBy.name, 'namesort'); + wrapper.instance().onDropDownItemClick(SortBy.name); - expect(wrapper.state().sortby).toBe('namesort'); - expect(wrapper.instance().sortState).toBe(SortBy.name); + expect(wrapper.state().sortby).toBe(SortBy.name); }); }); diff --git a/src/pages/RandomPage/RandomPage.tsx b/src/pages/RandomPage/RandomPage.tsx index baa7b0a..236890f 100644 --- a/src/pages/RandomPage/RandomPage.tsx +++ b/src/pages/RandomPage/RandomPage.tsx @@ -25,9 +25,18 @@ interface GetRandomMoviesType { class RandomPage extends React.Component<{}, state> { readonly LoadNR = 3; + // random seed to load videos, remains page reload. + seed = this.genRandInt(); + constructor(props: {}) { super(props); + // get previously stored location from localstorage + const storedseed = global.localStorage.getItem('randpageseed'); + if (storedseed != null) { + this.seed = parseInt(storedseed, 10); + } + this.state = { videos: [], tags: [] @@ -36,6 +45,10 @@ class RandomPage extends React.Component<{}, state> { this.keypress = this.keypress.bind(this); } + genRandInt(): number { + return Math.floor(Math.random() * 2147483647) + 1; + } + componentDidMount(): void { addKeyHandler(this.keypress); @@ -77,15 +90,21 @@ class RandomPage extends React.Component<{}, state> { * click handler for shuffle btn */ shuffleclick(): void { + this.genSeed(); this.loadShuffledvideos(this.LoadNR); } + genSeed(): void { + this.seed = this.genRandInt(); + global.localStorage.setItem('randpageseed', this.seed.toString()); + } + /** * load random videos from backend * @param nr number of videos to load */ loadShuffledvideos(nr: number): void { - callAPI(APINode.Video, {action: 'getRandomMovies', Number: nr}, (result) => { + callAPI(APINode.Video, {action: 'getRandomMovies', Number: nr, Seed: this.seed}, (result) => { this.setState({videos: []}); // needed to trigger rerender of main videoview this.setState({ videos: result.Videos, @@ -101,7 +120,8 @@ class RandomPage extends React.Component<{}, state> { private keypress(event: KeyboardEvent): void { // bind s to shuffle if (event.key === 's') { - this.loadShuffledvideos(4); + this.genSeed(); + this.loadShuffledvideos(this.LoadNR); } } }