Best Python code snippet using pytest-play_python
UserStore.js
Source:UserStore.js  
1import {action, observable} from 'mobx'2import I18n from "react-native-i18n";3import {removeCurrentMusic, saveLanguage, saveMusicRepeat} from "../util/Store";4import EventRegister, {ON_SLIDING_COMPLETE} from "../util/EventRegister";5export default class UserStore {6    @observable language = 'en'7    @observable music = {8        id: null,9        audioUrl: null,10        isPlay: false,11        timeTotal: 0,12        currentPosition: 0,13        volume: 0.6,14        musicDetail: []15    }16    @observable isRepeatAll = true17    @observable isEdit = false18    @observable nextOrder = []19    @observable listItemDownload = []20    @observable itemDownload = -121    @observable progressDownload = 022    @observable playlist = []23    @observable musicPlaylist = []24    @observable musicPlaylistDisplay = []25    @observable musicPlaylistPlay = []26    initMusic = () => {27        return {28            id: null,29            audioUrl: null,30            isPlay: false,31            timeTotal: 0,32            currentPosition: 0,33            volume: 0.6,34            music_id: null,35            musicDetail: []36        }37    }38    @action updateProgressDownload(progressDownload) {39        this.progressDownload = progressDownload40    }41    @action onEndMusicDemo() {42        this.music = this.initMusic()43    }44    @action updateItemDownload(itemDownload) {45        this.itemDownload = itemDownload46    }47    @action saveItemDownload(itemDownload, callback) {48        let listItemDownload = this.listItemDownload.slice()49        const indexAvailable = listItemDownload.findIndex(item => itemDownload.id === item.id)50        if (indexAvailable === -1) {51            this.listItemDownload = [...listItemDownload, itemDownload]52            callback(true)53        } else {54            callback(false)55        }56    }57    @action removeItemDownload(itemDownload) {58        let listItemDownload = this.listItemDownload.slice()59        this.listItemDownload = listItemDownload.filter(item => item.id !== itemDownload.id)60    }61    @action emptyItemDownload() {62        this.listItemDownload = []63    }64    @action initPlaylist(playlist, musicPlaylist, currentMusic) {65        let currentMusicActive = false66        playlist.forEach((item, index) => {67            if (currentMusic && currentMusic.playlist_id && item.is_active) {68                item.isSelect = item.id === currentMusic.playlist_id69                currentMusicActive = true70                if (item.id === currentMusic.playlist_id) this.isRepeatAll = item.is_repeat_all71            } else {72                item.isSelect = index === 073                if (index === 0) this.isRepeatAll = item.is_repeat_all74            }75        })76        this.playlist = playlist77        this.musicPlaylist = musicPlaylist78        let musicPlaylistInit = []79        if (musicPlaylist.length > 0) {80            musicPlaylistInit = musicPlaylist.filter((music, index) => {81                if (currentMusicActive) {82                    return music.playlist.id === currentMusic.playlist_id83                }84                return music.playlist.id === playlist[0].id85            })86            // if (musicPlaylistInit.length > 0) this.music = this.convertMusicPlayObject(musicPlaylistInit[0], false)87        }88        if (currentMusicActive) {89            this.musicPlaylistPlay = musicPlaylistInit90            this.music = {91                ...currentMusic,92                isPlay: false93            }94        }95        this.musicPlaylistDisplay = musicPlaylistInit96    }97    @action changePlaylistName(name, playlistSelect) {98        let playlist = this.playlist.slice()99        playlist.forEach((item, index) => {100            if (item.id === playlistSelect.id) {101                playlist[index].name = name102            }103        })104        this.playlist = playlist105    }106    @action addMusicToPlaylist(music, playlistSelect) {107        let musicPlaylist = this.musicPlaylist.slice()108        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()109        let musicPlaylistPlay = this.musicPlaylistPlay.slice()110        const playlist = this.playlist.slice()111        const indexAvailable = musicPlaylist.findIndex(item => music.id === item.id)112        if (indexAvailable === -1) {113            // if (musicPlaylist.length === 0) {114            //     this.music = this.convertMusicPlayObject(music, false)115            // }116            musicPlaylist = [music, ...musicPlaylist]117            // if (playlist[4].is_active) {118            const index = playlist.findIndex(item => item.isSelect)119            if (index !== -1) {120                if (playlist[index].id === playlistSelect.id) {121                    musicPlaylistDisplay = [music, ...musicPlaylistDisplay]122                }123                if (musicPlaylistPlay.length > 0) {124                    if (playlistSelect.id === musicPlaylistPlay[0].playlist.id) {125                        musicPlaylistPlay = [music, ...musicPlaylistPlay]126                    }127                }128            }129            // } else if (playlist[0].is_active) {130            //     musicPlaylistDisplay = musicPlaylist131            //     musicPlaylistPlay = musicPlaylist132            // }133            this.musicPlaylistDisplay = musicPlaylistDisplay134            this.musicPlaylistPlay = musicPlaylistPlay135            this.musicPlaylist = musicPlaylist136        }137    }138    @action changeSelectPlaylist(playlistSelect) {139        let playlist = this.playlist.slice()140        playlist.forEach(item => {141            item.isSelect = (item.id === playlistSelect.id)142        })143        this.playlist = playlist144        this.isRepeatAll = playlistSelect.is_repeat_all145        let musicPlaylist = this.musicPlaylist.slice()146        if (musicPlaylist.length > 0) {147            this.musicPlaylistDisplay = musicPlaylist.filter((music, index) => {148                return music.playlist.id === playlistSelect.id149            })150        }151    }152    @action toggleRepeat() {153        this.isRepeatAll = !this.isRepeatAll154        this.playlist.forEach(item => {155            if (item.isSelect) item.is_repeat_all = this.isRepeatAll156        })157        // saveMusicRepeat(this.isRepeatAll)158    }159    @action setAllRepeat(isRepeatAll) {160        this.isRepeatAll = isRepeatAll161    }162    @action switchEdit() {163        this.isEdit = !this.isEdit164    }165    @action changeLanguage(language) {166        this.language = language167        I18n.locale = language168        saveLanguage(language)169    }170    @action changeVolumeMusicPlaying(music) {171        if (music.id === this.music.id) this.music.volume = music.volume172        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()173        const indexDisplay = musicPlaylistDisplay.findIndex(element => element.id === music.id)174        if (indexDisplay !== -1) {175            musicPlaylistDisplay[indexDisplay].volume = music.volume176        }177        this.musicPlaylistDisplay = musicPlaylistDisplay178    }179    @action changeVolumeAudio(music) {180        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()181        const indexDisplay = musicPlaylistDisplay.findIndex(element => element.id === music.id)182        if (indexDisplay !== -1) {183            musicPlaylistDisplay[indexDisplay].volume = music.volume184            if (music.id === this.music.id) this.music.volume = music.volume185        }186        this.musicPlaylistDisplay = musicPlaylistDisplay187        let musicPlaylistPlay = this.musicPlaylistDisplay.slice()188        const indexPlay = musicPlaylistPlay.findIndex(element => element.id === music.id)189        if (indexPlay !== -1) {190            musicPlaylistPlay[indexPlay].volume = music.volume191            if (music.id === this.music.id) this.music.volume = music.volume192        }193        this.musicPlaylistPlay = musicPlaylistPlay194        let musicPlaylist = this.musicPlaylist.slice()195        const index = musicPlaylist.findIndex(element => element.id === music.id)196        if (index !== -1) {197            musicPlaylist[index].volume = music.volume198            if (music.id === this.music.id) this.music.volume = music.volume199        }200        this.musicPlaylist = musicPlaylist201    }202    convertMusicPlayObject = (music, isPlay) => {203        return {204            id: music.id,205            audioUrl: music.music.origin_url,206            isPlay,207            timeTotal: music.music.time_total || 0,208            currentPosition: 0,209            volume: music.volume,210            playlist_id: music.playlist.id,211            music_id: music.music.id,212            musicDetail: music.music.music_detail213        }214    }215    @action playAudio(item) {216        let musicPlaylist = this.musicPlaylist.slice()217        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()218        let musicPlaylistPlay = this.musicPlaylistPlay.slice()219        const prevIndexPlay = musicPlaylistPlay.findIndex(element => element.id === this.music.id)220        if (prevIndexPlay !== -1) musicPlaylistPlay[prevIndexPlay].isPlay = false221        const prevIndexDisplay = musicPlaylistDisplay.findIndex(element => element.id === this.music.id)222        if (prevIndexDisplay !== -1) musicPlaylistDisplay[prevIndexDisplay].isPlay = false223        const prevIndex = musicPlaylist.findIndex(element => element.id === this.music.id)224        if (prevIndex !== -1) musicPlaylist[prevIndex].isPlay = false225        if (musicPlaylistPlay.length > 0) {226            if (musicPlaylistDisplay[0].playlist.id === musicPlaylistPlay[0].playlist.id) {227                const indexPlay = musicPlaylistPlay.findIndex(element => element.id === item.id)228                // const indexDisplay = musicPlaylistDisplay.findIndex(element => element.id === item.id)229                const index = musicPlaylist.findIndex(element => element.id === item.id)230                if (indexPlay !== -1) {231                    musicPlaylistPlay[indexPlay].isPlay = true232                    musicPlaylistDisplay[indexPlay].isPlay = true233                    musicPlaylist[index].isPlay = true234                    if (musicPlaylistPlay[indexPlay].id === this.music.id) {235                        this.music.isPlay = true236                    } else {237                        this.music = this.convertMusicPlayObject(musicPlaylistPlay[indexPlay], true)238                    }239                    this.musicPlaylistPlay = musicPlaylistPlay240                    this.musicPlaylistDisplay = musicPlaylistDisplay241                    this.musicPlaylist = musicPlaylist242                }243            } else {244                musicPlaylistPlay = this.musicPlaylistDisplay.slice()245                const indexPlay = musicPlaylistPlay.findIndex(element => element.id === item.id)246                // const indexDisplay = musicPlaylistDisplay.findIndex(element => element.id === item.id)247                const index = musicPlaylist.findIndex(element => element.id === item.id)248                if (indexPlay !== -1) {249                    musicPlaylistPlay[indexPlay].isPlay = true250                    musicPlaylistDisplay[indexPlay].isPlay = true251                    musicPlaylist[index].isPlay = true252                    this.music = this.convertMusicPlayObject(musicPlaylistPlay[indexPlay], true)253                    this.musicPlaylistPlay = musicPlaylistPlay254                    this.musicPlaylistDisplay = musicPlaylistDisplay255                    this.musicPlaylist = musicPlaylist256                }257            }258        } else {259            musicPlaylistPlay = musicPlaylistDisplay260            const indexDisplay = musicPlaylistDisplay.findIndex(element => element.id === item.id)261            const index = musicPlaylist.findIndex(element => element.id === item.id)262            if (indexDisplay !== -1) {263                musicPlaylistPlay[indexDisplay].isPlay = true264                musicPlaylistDisplay[indexDisplay].isPlay = true265                musicPlaylist[index].isPlay = true266                this.music = this.convertMusicPlayObject(musicPlaylistPlay[indexDisplay], true)267                this.musicPlaylistPlay = musicPlaylistPlay268                this.musicPlaylistDisplay = musicPlaylistDisplay269                this.musicPlaylist = musicPlaylist270            }271        }272    }273    @action nextAudio(music, onEnd) {274        let musicPlaylistPlay = this.musicPlaylistPlay.slice()275        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()276        let musicPlaylist = this.musicPlaylist.slice()277        const indexPlay = musicPlaylistPlay.findIndex(element => element.id === music.id)278        const index = musicPlaylist.findIndex(element => element.id === music.id)279        if (indexPlay !== -1) {280            const isTheSameList = musicPlaylistDisplay.length > 0 && musicPlaylistDisplay[0].playlist.id === musicPlaylistPlay[0].playlist.id281            musicPlaylistPlay[indexPlay].isPlay = false282            if (isTheSameList) musicPlaylistDisplay[indexPlay].isPlay = false283            musicPlaylist[index].isPlay = false284            if (indexPlay < musicPlaylistPlay.length - 1) {285                this.music = this.convertMusicPlayObject(musicPlaylistPlay[indexPlay + 1], true)286                musicPlaylistPlay[indexPlay + 1].isPlay = true287                if (isTheSameList) musicPlaylistDisplay[indexPlay + 1].isPlay = true288                const nextIndex = musicPlaylist.findIndex(element => element.id === musicPlaylistPlay[indexPlay + 1].id)289                musicPlaylist[nextIndex].isPlay = true290            } else if (musicPlaylistPlay[0] && musicPlaylistPlay[0].playlist.is_repeat_all) {291                if (onEnd && onEnd.onEnd && musicPlaylistPlay.length === 1) {292                    EventRegister.emit(ON_SLIDING_COMPLETE, 0)293                    this.music.currentPosition = 0294                } else if (musicPlaylistPlay.length > 1) {295                    this.music = this.convertMusicPlayObject(musicPlaylistPlay[0], true)296                    musicPlaylistPlay[0].isPlay = true297                    if (isTheSameList) musicPlaylistDisplay[0].isPlay = true298                    const nextIndex = musicPlaylist.findIndex(element => element.id === musicPlaylistPlay[0].id)299                    musicPlaylist[nextIndex].isPlay = true300                }301            } else if (onEnd && onEnd.onEnd) {302                // Last music303                this.music = this.initMusic()304                removeCurrentMusic()305            }306            this.musicPlaylistPlay = musicPlaylistPlay307            this.musicPlaylistDisplay = musicPlaylistDisplay308            this.musicPlaylist = musicPlaylist309        }310    }311    @action prevAudio(music) {312        let musicPlaylistPlay = this.musicPlaylistPlay.slice()313        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()314        let musicPlaylist = this.musicPlaylist.slice()315        const indexPlay = musicPlaylistPlay.findIndex(element => element.id === music.id)316        const index = musicPlaylist.findIndex(element => element.id === music.id)317        if (indexPlay !== -1 && indexPlay > 0) {318            const isTheSameList = musicPlaylistDisplay.length > 0 && musicPlaylistDisplay[0].playlist.id === musicPlaylistPlay[0].playlist.id319            musicPlaylistPlay[indexPlay].isPlay = false320            if (isTheSameList) musicPlaylistDisplay[indexPlay].isPlay = false321            musicPlaylist[index].isPlay = false322            this.music = this.convertMusicPlayObject(musicPlaylistPlay[indexPlay - 1], true)323            musicPlaylistPlay[indexPlay - 1].isPlay = true324            if (isTheSameList) musicPlaylistDisplay[indexPlay - 1].isPlay = true325            const nextIndex = musicPlaylist.findIndex(element => element.id === musicPlaylistPlay[indexPlay - 1].id)326            musicPlaylist[nextIndex].isPlay = true327        }328        this.musicPlaylistPlay = musicPlaylistPlay329        this.musicPlaylistDisplay = musicPlaylistDisplay330        this.musicPlaylist = musicPlaylist331    }332    @action playAudioDemo(music) {333        this.music.isPlay = false334        this.music = {335            ...music,336            currentPosition: 0,337            volume: 0.6,338            isDemo: true339        }340    }341    @action changePlay(isPlay, music) {342        if (music) {343            this.music = {344                ...music,345                isPlay: isPlay346            }347        } else {348            this.music.isPlay = isPlay349        }350        let musicPlaylistPlay = this.musicPlaylistPlay.slice()351        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()352        let musicPlaylist = this.musicPlaylist.slice()353        const indexPlay = musicPlaylistPlay.findIndex(element => element.id === this.music.id)354        const index = musicPlaylist.findIndex(element => element.id === this.music.id)355        if (indexPlay !== -1) {356            const isTheSameList = musicPlaylistDisplay.length > 0 && musicPlaylistDisplay[0].playlist.id === musicPlaylistPlay[0].playlist.id357            musicPlaylistPlay[indexPlay].isPlay = isPlay358            musicPlaylist[index].isPlay = isPlay359            if (isTheSameList) musicPlaylistDisplay[indexPlay].isPlay = isPlay360            this.musicPlaylistPlay = musicPlaylistPlay361            this.musicPlaylistDisplay = musicPlaylistDisplay362            this.musicPlaylist = musicPlaylist363        }364    }365    @action updateNextOrder(nextOrder) {366        if (nextOrder && nextOrder.length > 0) this.nextOrder = nextOrder367    }368    @action updateMusicByNewOrder = () => {369        let musicPlaylistPlay = this.musicPlaylistPlay.slice()370        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()371        let temp = []372        this.nextOrder.forEach((item, index) => {373            temp.push(musicPlaylistDisplay[parseInt(item)])374        })375        if (musicPlaylistPlay.length > 0) {376            if (musicPlaylistPlay[0].playlist.id === musicPlaylistDisplay[0].playlist.id) {377                this.musicPlaylistPlay = temp378            }379        }380        this.musicPlaylistDisplay = temp381        this.nextOrder = []382    }383    @action deleteMusic(music) {384        let musicPlaylist = this.musicPlaylist.slice()385        this.musicPlaylist = musicPlaylist.filter((item) => {386            return item.id !== music.id387        })388        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()389        this.musicPlaylistDisplay = musicPlaylistDisplay.filter((item) => {390            return item.id !== music.id391        })392        let musicPlaylistPlay = this.musicPlaylistPlay.slice()393        if (musicPlaylistPlay.length > 0) {394            this.musicPlaylistPlay = musicPlaylistPlay.filter((item) => {395                return item.id !== music.id396            })397        }398        if (music.id === this.music.id) {399            this.music = this.initMusic()400        }401    }402    @action updateCurrentPosition(currentPosition) {403        const comparePosition = currentPosition - this.music.currentPosition404        if (comparePosition < 2 && comparePosition > 0)405            this.music.currentPosition = currentPosition406    }407    @action replayMusic(isReplay) {408        this.music.isReplay = isReplay409        let musicPlaylistPlay = this.musicPlaylistPlay.slice()410        let musicPlaylistDisplay = this.musicPlaylistDisplay.slice()411        let musicPlaylist = this.musicPlaylist.slice()412        const indexPlay = musicPlaylistPlay.findIndex(element => element.id === this.music.id)413        const index = musicPlaylist.findIndex(element => element.id === this.music.id)414        if (indexPlay !== -1) {415            const isTheSameList = musicPlaylistDisplay.length > 0 && musicPlaylistDisplay[0].playlist.id === musicPlaylistPlay[0].playlist.id416            musicPlaylistPlay[indexPlay].isReplay = isReplay417            musicPlaylist[index].isReplay = isReplay418            if (isTheSameList) musicPlaylistDisplay[indexPlay].isReplay = isReplay419            this.musicPlaylistPlay = musicPlaylistPlay420            this.musicPlaylistDisplay = musicPlaylistDisplay421            this.musicPlaylist = musicPlaylist422        }423    }424    @action onChangeSeekBar(currentPosition, onChangeSlide) {425        this.music.onChangeSlide = onChangeSlide426        this.music.currentPosition = Math.floor(currentPosition)427        // this.music.isPlay = isPlay428        // let musicPlaylistPlay = this.musicPlaylistPlay.slice()429        // musicPlaylistPlay.forEach((item, index) => {430        //     if (item.id === this.music.id) {431        //         musicPlaylistPlay[index].isPlay = isPlay432        //     }433        // })434        // this.musicPlaylistPlay = musicPlaylistPlay435    }436    @action setDuration(timeTotal) {437        this.music.timeTotal = timeTotal438    }439    @action setTimeTotalPlay(timeTotalPlay) {440        this.music.timeTotalPlay = timeTotalPlay441    }442    @action setTimePlay(timePlay) {443        this.music.timePlay = timePlay444    }...skin.js
Source:skin.js  
1var getskins = [{2	"skin:skip": "VSG",3	"vsg-skins:skip": "vsg",4	".vjs-control-bar[font-size]:px": "14",5	".vjs-control-bar2[background-color]": "#000000",6	".vjs-control-bar[background-color]:important": "rgba(0,0,0,0.3)",7	".vjs-play-progress| .vjs-volume-level[background-color]": "#2483d5",8	".vjs-control-bar[color]": "#ffffff",9	".vjs-big-play-button[background-color]": "rgba(0,0,0,0.45)",10	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(36,131,213,0.9)",11	".vjs-big-play-button[border-radius]:percent": "50",12	".vjs-big-play-button[font-size]:em": "3.5",13	".vjs-big-play-button[height]:emimportant": "2",14	".vjs-big-play-button[line-height]:emimportant": "2",15	".vjs-big-play-button[margin-top]:emimportant": "-1",16	"radius:skip": "2",17	".vjs-loading-spinner[border-color]": "rgba(36,131,213,0.8)",18	"customcss:skip": ""19}, {20	"skin:skip": "Sublim",21	"vsg-skins:skip": "default",22	".vjs-control-bar2[background-color]": "transparent",23	".vjs-control-bar[background-color]:important": "rgba(0,0,0,0)",24	".vjs-control-bar[color]": "#ffffff",25	".vjs-play-progress| .vjs-volume-level[background-color]": "#cccccc",26	".vjs-control-bar[font-size]:px": "18",27	".vjs-big-play-button[background-color]": "rgba(255,255,255,0.25)",28	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(255,255,255,0.45)",29	".vjs-big-play-button[font-size]:em": "3.5",30	".vjs-big-play-button[border-radius]:percent": "35",31	".vjs-big-play-button[height]:emimportant": "1.6",32	".vjs-big-play-button[line-height]:emimportant": "1.6",33	".vjs-big-play-button[margin-top]:emimportant": "-0.8",34	"radius:skip": "1.6",35	".vjs-loading-spinner[border-color]": "rgba(255,255,255,0.7)",36	"customcss:skip": ".video-js  .vjs-progress-holder {\r\n    font-size: 1.7em;\r\nborder-radius: 10px;\r\n}\r\n.video-js .vjs-progress-holder .vjs-play-progress, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-load-progress div, .video-js .vjs-slider,.vjs-volume-level {\r\n    border-radius: 10px;\r\n}\r\n.video-js .vjs-load-progress {\r\n    background: rgba(255,255,255,0.2);\r\n}"37}, {38	"skin:skip": "Magnified",39	"vsg-skins:skip": "vsg",40	".vjs-control-bar[font-size]:px": "16",41	".vjs-control-bar2[background-color]": "#fcfcfc",42	".vjs-control-bar[background-color]:important": "rgba(252,252,252,0.19)",43	".vjs-play-progress| .vjs-volume-level[background-color]": "#cccccc",44	".vjs-control-bar[color]": "#ffffff",45	".vjs-big-play-button[background-color]": "rgba(255,255,255,0.1)",46	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(255,255,255,0.23)",47	".vjs-big-play-button[border-radius]:percent": "50",48	".vjs-big-play-button[font-size]:em": "6",49	".vjs-big-play-button[height]:emimportant": "2",50	".vjs-big-play-button[line-height]:emimportant": "2",51	".vjs-big-play-button[margin-top]:emimportant": "-1",52	"radius:skip": "2",53	".vjs-loading-spinner[border-color]": "rgba(255,255,255,0.7)",54	"customcss:skip": ""55}, {56	"skin:skip": "SunRise",57	"vsg-skins:skip": "vsg",58	".vjs-control-bar[font-size]:px": "14",59	".vjs-control-bar2[background-color]": "#ebff04",60	".vjs-control-bar[background-color]:important": "rgba(235,255,4,0.4)",61	".vjs-play-progress| .vjs-volume-level[background-color]": "#cccccc",62	".vjs-control-bar[color]": "#ffffff",63	".vjs-big-play-button[background-color]": "rgba(235,255,4,0.4)",64	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(235,255,4,0.5)",65	".vjs-big-play-button[border-radius]:percent": "50",66	".vjs-big-play-button[font-size]:em": "4",67	".vjs-big-play-button[height]:emimportant": "2",68	".vjs-big-play-button[line-height]:emimportant": "2",69	".vjs-big-play-button[margin-top]:emimportant": "-1",70	"radius:skip": "2",71	".vjs-loading-spinner[border-color]": "rgba(255,255,255,0.7)",72	"customcss:skip": ""73}, {74	"skin:skip": "TechSkin",75	"vsg-skins:skip": "vsg",76	".vjs-control-bar[font-size]:px": "14",77	".vjs-control-bar2[background-color]": "#0e223d",78	".vjs-control-bar[background-color]:important": "#0e223d",79	".vjs-control-bar[color]": "#ffffff",80	".vjs-play-progress| .vjs-volume-level[background-color]": "rgba(14,34,61,0.8)",81	".vjs-big-play-button[background-color]": "rgba(14,34,61,0.7)",82	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "#0e223d",83	".vjs-big-play-button[border-radius]:percent": "12",84	".vjs-big-play-button[font-size]:em": "3.5",85	".vjs-big-play-button[height]:emimportant": "1.4",86	".vjs-big-play-button[line-height]:emimportant": "1.4",87	".vjs-big-play-button[margin-top]:emimportant": "-0.7",88	"radius:skip": "1.4",89	".vjs-loading-spinner[border-color]": "rgba(14,34,61,0.84)",90	"customcss:skip": ""91}, {92	"skin:skip": "Youtube",93	"vsg-skins:skip": "vsg",94	".vjs-control-bar[font-size]:px": "12",95	".vjs-control-bar2[background-color]": "#000000",96	".vjs-control-bar[background-color]:important": "rgba(0,0,0,0.3)",97	".vjs-play-progress| .vjs-volume-level[background-color]": "#cc181e",98	".vjs-control-bar[color]": "#ffffff",99	".vjs-big-play-button[background-color]": "rgba(0,0,0,0.5)",100	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "#cc181e",101	".vjs-big-play-button[border-radius]:percent": "20",102	".vjs-big-play-button[font-size]:em": "2.5",103	".vjs-big-play-button[height]:emimportant": "1.4",104	".vjs-big-play-button[line-height]:emimportant": "1.4",105	".vjs-big-play-button[margin-top]:emimportant": "-0.7",106	"radius:skip": "1.4",107	".vjs-loading-spinner[border-color]": "#cc181e",108	"customcss:skip": ".video-js .vjs-load-progress {\r\n    background: rgba(255,255,255,0.3);\r\n}"109}, {110	"skin:skip": "Facebook Player",111	"vsg-skins:skip": "default",112	".vjs-control-bar[font-size]:px": "18",113	".vjs-control-bar2[background-color]": "transparent",114	".vjs-control-bar[background-color]:important": "rgba(0,0,0,0)",115	".vjs-control-bar[color]": "#ffffff",116	".vjs-play-progress| .vjs-volume-level[background-color]": "#2483d5",117	".vjs-big-play-button[background-color]": "rgba(0,0,0,0.35)",118	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(0,0,0,0.35)",119	".vjs-big-play-button[border-radius]:percent": "50",120	".vjs-big-play-button[font-size]:em": "3.5",121	".vjs-big-play-button[height]:emimportant": "2",122	".vjs-big-play-button[line-height]:emimportant": "2",123	".vjs-big-play-button[margin-top]:emimportant": "-1",124	"radius:skip": "2",125	".vjs-loading-spinner[border-color]": "rgba(255,255,255,0.7)",126	"customcss:skip": ".video-js .vjs-big-play-button {\r\n    height: 2em !important;\r\n    width: 2em !important;\r\n    line-height: 1.9em !important;\r\n    margin-top: -1em !important;\r\nmargin-left: -1em;\r\nborder-width:3px\r\n}\r\n .video-js .vjs-icon-play:before, .video-js .vjs-big-play-button:before {\r\n    font-size: 50px;\r\n}\r\n.video-js  .vjs-progress-holder {\r\n    font-size: 1.7em;\r\nborder-radius: 10px;\r\n}\r\n.video-js .vjs-progress-holder .vjs-play-progress, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-load-progress div, .video-js .vjs-slider,.vjs-volume-level {\r\n    border-radius: 10px;\r\n}\r\n.video-js .vjs-load-progress {\r\n    background: rgba(255,255,255,0.5);\r\n}"127}, {128	"skin:skip": "Twitter",129	"vsg-skins:skip": "default",130	".vjs-control-bar2[background-color]": "transparent",131	".vjs-control-bar[background-color]:important": "rgba(0,0,0,0)",132	".vjs-control-bar[color]": "#ffffff",133	".vjs-play-progress| .vjs-volume-level[background-color]": "#2c97de",134	".vjs-control-bar[font-size]:px": "17",135	".vjs-big-play-button[background-color]": "rgba(44,151,222,0.8)",136	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(44,151,222,0.9)",137	".vjs-big-play-button[font-size]:em": "2.5",138	".vjs-big-play-button[border-radius]:percent": "50",139	".vjs-big-play-button[height]:emimportant": "2",140	".vjs-big-play-button[line-height]:emimportant": "2",141	".vjs-big-play-button[margin-top]:emimportant": "-1",142	"radius:skip": "2",143	".vjs-loading-spinner[border-color]": "#2c97de",144	"customcss:skip": ".video-js .vjs-big-play-button {\r\n    height: 2em !important;\r\n    width: 2em !important;\r\n    line-height: 1.7em !important;\r\n    margin-top: -1em !important;\r\nmargin-left: -1em;\r\nborder-width:4px\r\n}\r\n .video-js .vjs-icon-play:before, .video-js .vjs-big-play-button:before {\r\n    font-size: 40px;\r\n}\r\n.video-js  .vjs-progress-holder {\r\n    font-size: 1.7em;\r\nborder-radius: 10px;\r\n}\r\n.video-js .vjs-progress-holder .vjs-play-progress, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-load-progress div, .video-js .vjs-slider,.vjs-volume-level {\r\n    border-radius: 10px;\r\n}\r\n.video-js .vjs-load-progress {\r\n    background: rgba(255,255,255,0.5);\r\n}\r\n.video-js, .video-js video, .vjs-poster, .video-js .vjs-tech {\r\n    border-radius: 8px;\r\n}"145}, {146	"skin:skip": "Rotten Tomatoes",147	"vsg-skins:skip": "default",148	".vjs-control-bar[font-size]:px": "11",149	".vjs-control-bar2[background-color]": "#3a9425",150	".vjs-control-bar[background-color]:important": "#3a9425",151	".vjs-play-progress| .vjs-volume-level[background-color]": "#f3ec1a",152	".vjs-control-bar[color]": "#ffffff",153	".vjs-big-play-button[background-color]": "rgba(58,148,37,0.7)",154	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "#3a9425",155	".vjs-big-play-button[border-radius]:percent": "15",156	".vjs-big-play-button[font-size]:em": "3",157	".vjs-big-play-button[height]:emimportant": "1.8",158	".vjs-big-play-button[line-height]:emimportant": "1.8",159	".vjs-big-play-button[margin-top]:emimportant": "-0.9",160	"radius:skip": "1.8",161	".vjs-loading-spinner[border-color]": "#3a9425",162	"customcss:skip": ".video-js .vjs-slider {\r\n    background-color: #3b3d41\r\n}\r\n.video-js .vjs-load-progress {\r\n    background: rgba(252,249,133,0.7);\r\n}\r\n.video-js .vjs-big-play-button {\r\n    color: #f3ec1a;\r\n    border-color: #f3ec1a;\r\n}"163}, {164	"skin:skip": "twitch.tv",165	"vsg-skins:skip": "vsg",166	".vjs-control-bar[font-size]:px": "12",167	".vjs-control-bar2[background-color]": "#000000",168	".vjs-control-bar[background-color]:important": "rgba(0,0,0,0.4)",169	".vjs-control-bar[color]": "#ffffff",170	".vjs-play-progress| .vjs-volume-level[background-color]": "#b99beb",171	".vjs-big-play-button[background-color]": "rgba(0,0,0,0)",172	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "rgba(0,0,0,0)",173	".vjs-big-play-button[border-radius]:percent": "0",174	".vjs-big-play-button[font-size]:em": "8",175	".vjs-big-play-button[height]:emimportant": "1",176	".vjs-big-play-button[line-height]:emimportant": "1",177	".vjs-big-play-button[margin-top]:emimportant": "-0.5",178	"radius:skip": "1",179	".vjs-loading-spinner[border-color]": "#b99beb",180	"customcss:skip": ".video-js .vjs-load-progress {\r\n    background: rgba(255,255,255,0.8);\r\n}\r\n.video-js .vjs-big-play-button:hover{\r\n    color: #b99beb ;\r\n}\r\n.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before {\r\n   color: #b99beb ;\r\n   text-shadow:none\r\n}"181}, {182	"skin:skip": "Reset",183	"vsg-skins:skip": "default",184	".vjs-control-bar2[background-color]": "#000000",185	".vjs-control-bar[background-color]:important": "",186	".vjs-control-bar[color]": "",187	".vjs-play-progress| .vjs-volume-level[background-color]": "",188	".vjs-control-bar[font-size]:px": "10",189	".vjs-big-play-button[background-color]": "",190	"@hover .vjs-big-play-button|.vjs-big-play-button@focus|.vjs-big-play-button@active[background-color]": "",191	".vjs-big-play-button[font-size]:em": "3",192	".vjs-big-play-button[border-radius]:percent": "12",193	".vjs-big-play-button[height]:emimportant": "1.7",194	".vjs-big-play-button[line-height]:emimportant": "1.7",195	".vjs-big-play-button[margin-top]:emimportant": "-0.85",196	"radius:skip": "1.7",197	".vjs-loading-spinner[border-color]": "",198	"customcss:skip": ""...ai.service.ts
Source:ai.service.ts  
1import { Injectable, OnDestroy } from '@angular/core';2import { Subject, Observable, zip, merge, of } from 'rxjs';3import { withLatestFrom, map, switchMap, filter, tap, startWith, takeUntil, share, scan, delay } from 'rxjs/operators';4import { CardService, Card } from '@mtg-devs/api';5import { TableZone, TableCardMoved } from '@mtg-devs/components';6import { AiPlayTemplate, AiPlay, AI_PLAY, AiPlayType } from './ai-model';7import { PlayTestAiHandStore } from '../store/play-test-ai-hand-store';8import { PlayTestBattlefieldStore } from '../store/play-test-battlefield-store';9import { PlayTestLandStore } from '../store/play-test-land-store';10@Injectable({ providedIn: 'root' })11export class AiService implements OnDestroy {12  private tickSub = new Subject<void>();13  private responseSub = new Subject<boolean>();14  private destroySub = new Subject<void>();15  private drawModuloSub = new Subject<number>();16  private hand$: Observable<AiPlayTemplate[]>;17  private playCard$: Observable<AiPlay | null>;18  private battlefield$: Observable<Card[]> = this.battlefield.get();19  private land$: Observable<Card[]> = this.land.get();20  private cardOnStack$: Observable<Card | null>;21  private resolvedPlay$: Observable<AiPlay>;22  private aiPlays: AiPlayTemplate[] = [];23  constructor(24    private cardService: CardService,25    private hand: PlayTestAiHandStore,26    private battlefield: PlayTestBattlefieldStore,27    private land: PlayTestLandStore28  ) {29    this.buildObservables();30  }31  tick(): void {32    this.tickSub.next();33  }34  respond(resolve: boolean): void {35    this.responseSub.next(resolve);36  }37  init(drawModulo: number, aiPlays: AiPlayTemplate[]): void {38    this.hand.clear();39    this.aiPlays = aiPlays;40    this.drawModuloSub.next(drawModulo);41  }42  getAiMovedCard(): Observable<TableCardMoved> {43    return this.resolvedPlay$.pipe(44      filter(play => play && play.template.type === AiPlayType.Interaction),45      map(play => {46        return {47          card: play.target,48          source: play.source,49          target: play.template.resolutionZone50        };51      })52    );53  }54  getCardOnStack(): Observable<Card | null> {55    return this.cardOnStack$;56  }57  getAiAddPermanent(): Observable<AiPlayTemplate> {58    return this.resolvedPlay$.pipe(59      filter(play => play && play.template.type === AiPlayType.Permanent),60      map(play => play.template)61    );62  }63  getAiHandSize(): Observable<number> {64    return this.hand.get().pipe(65      map(plays => plays.length)66    );67  }68  drawCard(amount: number = 1): void {69    while (amount--) {70      this.hand.add(this.getRandom(this.aiPlays));71    }72  }73  discardCard(amount: number = 1): void {74    while (amount--) {75      this.hand.pop();76    }77  }78  private buildObservables(): void {79    this.hand$ = this.hand.get().pipe(80      switchMap(plays => {81        if (plays.length === 0) {82          return of([]);83        }84        return zip(...plays.map(play => {85          return this.cardService.getCard(play.cardName).pipe(86            map(card => Object.assign(play, { card }))87          );88        }));89      })90    );91    this.playCard$ = this.tickSub.pipe(92      delay(0), // wait for stores to update at beginning of turn93      withLatestFrom(this.hand$, this.battlefield$, this.land$),94      map(([, cards, battlefield, land]) => this.findPlay(cards, battlefield, land)),95      share()96    );97    this.resolvedPlay$ = this.playCard$.pipe(98      filter(play => !!play),99      switchMap(card => this.responseSub.pipe(map(resolve => resolve ? card : null)))100    );101    this.cardOnStack$ = merge(this.responseSub, this.playCard$).pipe(102      map(response => (!response || typeof response === 'boolean') ? null : response.template.card),103      startWith(null as Card)104    );105    this.resolvedPlay$106      .pipe(takeUntil(this.destroySub))107      .subscribe(play => this.hand.remove(play.template));108    const drawCard$ = merge(this.drawModuloSub, this.tickSub).pipe(109      scan((acc, curr) => typeof curr === 'number' ? 0 : acc + 1, 0),110      withLatestFrom(this.drawModuloSub),111      filter(([counter, drawModulo]) => counter % drawModulo === 0)112    );113    drawCard$114      .pipe(takeUntil(this.destroySub))115      .subscribe(() => this.drawCard());116  }117  private findPlay(hand: AiPlayTemplate[], battlefield: Card[], land: Card[]): AiPlay | null {118    const interactions = hand.filter(play => play.type === AiPlayType.Interaction);119    const permanents = hand.filter(play => play.type === AiPlayType.Permanent);120    return this.findInteractionPlay(interactions, battlefield, land) || this.findPermanentPlay(permanents);121  }122  private findPermanentPlay(permanents: AiPlayTemplate[]): AiPlay | null {123    const play = this.getRandom(permanents);124    return play ? { template: play } : null;125  }126  private findInteractionPlay(hand: AiPlayTemplate[], battlefield: Card[], land: Card[]): AiPlay | null {127    const plays = [128      this.findInteractionPlayInZone(hand, battlefield, TableZone.Battlefield),129      this.findInteractionPlayInZone(hand, land, TableZone.Land)130    ];131    return plays132      .filter(play => !!play)133      .sort((a, b) => b.score - a.score)[0] || null;134  }135  private findInteractionPlayInZone(plays: AiPlayTemplate[], cards: Card[], zone: TableZone): AiPlay | null {136    const playsForZone = plays.filter(play => this.legalZone(play, zone));137    const optimalPlay = playsForZone.reduce((acc, curr) => {138      const target = this.legalTargetWithHighestCmc(curr, cards);139      if (!curr.card) {140        console.warn(`AI tried to play ${curr.cardName}, but found no such card in magic.`); // tslint:disable-line141        return acc;142      }143      if (target) {144        const score = target.convertedManaCost / (curr.card.convertedManaCost || 1);145        if (!acc || score > acc.score) {146          return {147            template: curr,148            source: zone,149            score,150            target151          };152        }153      }154      return acc;155    }, null as AiPlay | null);156    return optimalPlay;157  }158  private legalTargetWithHighestCmc(play: AiPlayTemplate, cards: Card[]): Card | null {159    const legalTargets = cards160      .filter(card => card.types.some(type => play.target.types.includes(type)))161      .sort((a, b) => b.convertedManaCost - a.convertedManaCost);162    return legalTargets[0] || null;163  }164  private legalZone(play: AiPlayTemplate, zone: TableZone): boolean {165    return play.target.zones.some(z => z === zone);166  }167  private getRandom(plays: AiPlayTemplate[]): AiPlayTemplate {168    return plays[Math.floor(Math.random() * plays.length)];169  }170  ngOnDestroy(): void {171    this.destroySub.next();172    this.destroySub.complete();173  }...js-functions.js
Source:js-functions.js  
2  get() {},3  get(arg) {},4  set() {},5  set(arg) {},6  play() {},7  play(arg) {},8  'play'() {},9  'play'(arg) {},10  *play() {},11  *play(arg) {},12  async play() {},13  async play(arg) {},14  get play() {},15  set play(arg) {},16  *'play'() {},17  *'play'(arg) {},18  async 'play'() {},19  async 'play'(arg) {},20  get 'play'() {},21  set 'play'(arg) {},22  [Play.name()]() {},23  [Play.name()[]](arg) {},24  *[Play.name()]() {},25  *[Play.name()](arg) {},26  async [Play.name()]() {},27  async [Play.name()](arg) {},28  get [Play.name()]() {},29  set [Play.name()](arg) {},30  0() {},31  0(arg) {},32  *0() {},33  *0(arg) {},34  async 0() {},35  async 0(arg) {},36  get 0() {},37  set 0(arg) {},38  play: function() {},39  play: function(arg) {},40  play: function*() {},41  play: function*(arg) {},42  play: async function() {},43  play: async function(arg) {},44  play: async function*() {},45  play: async function*(arg) {},46  play: async () => {},47  play: async (arg) => {},48  play: async arg => {},49  play: () => {},50  play: (arg) => {},51  play: arg => {},52  "play": function() {},53  "play": function(arg) {},54  "play": function*() {},55  "play": function*(arg) {},56  "play": async function() {},57  "play": async function(arg) {},58  "play": async function*() {},59  "play": async function*(arg) {},60  "play": async () => {},61  "play": async (arg) => {},62  "play": async arg => {},63  "play": () => {},64  "play": (arg) => {},65  "play": arg => {},66  [play]: function() {},67  [play]: function(arg) {},68  [play]: function*() {},69  [play]: function*(arg) {},70  [play]: async function() {},71  [play]: async function(arg) {},72  [play]: async function*() {},73  [play]: async function*(arg) {},74  [play]: async () => {},75  [play]: async (arg) => {},76  [play]: async arg => {},77  [play]: () => {},78  [play]: (arg) => {},79  [play]: arg => {}80}81class Sound<T, T> extends Model<T, T> {82  get() {}83  get(arg) {}84  set() {}85  set(arg) {}86  *get() {}87  *get(arg) {}88  *set() {}89  *set(arg) {}90  async get() {}91  async get(arg) {}92  async set() {}93  async set(arg) {}94  static get() {}95  static get(arg) {}96  static set() {}97  static set(arg) {}98  static *get() {}99  static *get(arg) {}100  static *set() {}101  static *set(arg) {}102  static async get() {}103  static async get(arg) {}104  static async set() {}105  static async set(arg) {}106  static get get() {}107  static set set(arg) {}108  play() {}109  play(arg) {}110  'play'() {}111  'play'(arg) {}112  *play() {}113  *play(arg) {}114  *'play'() {}115  *'play'(arg) {}116  async play() {}117  async play(arg) {}118  get play() {}119  set play(arg) {}120  static play() {}121  static play(arg) {}122  static *play() {}123  static *play(arg) {}124  static async play() {}125  static async play(arg) {}126  static get play() {}127  static set play(arg) {}128  0() {}129  0(arg) {}130  *0() {}131  *0(arg) {}132  async 0() {}133  async 0(arg) {}134  get 0() {}135  set 0(arg) {}136  static 0() {}137  static 0(arg) {}138  static *0() {}139  static *0(arg) {}140  static async 0() {}141  static async 0(arg) {}142  [play]() {}143  [play](arg) {}144  *[play]() {}145  *[play](arg) {}146  async [play]() {}147  async [play](arg) {}148  get [play]() {}149  set [play](arg) {}150  static [play]() {}151  static [play](arg) {}152  static *[play]() {}153  static *[play](arg) {}154  static async [play]() {}155  static async [play](arg) {}156  static get [play]() {}157  static set [play](arg) {}158}159Sound160Sound()161Sound = {}162Sound.play163Sound[play]164Sound.play()165Sound[play]()166Sound.play = {}167Sound[play] = {}168Sound.prototype169Sound.prototype()170Sound.prototype = {}171Sound.prototype.play172Sound.prototype.play()173Sound.prototype[play]()174Sound.prototype.play =175Sound.prototype[play] =176Sound.play.repeat177Sound[play].repeat178Sound.play.repeat()179Sound[play].repeat()180Sound.play.repeat = {}181Sound[play].repeat = {}182Sound.prototype.play = function() {}183Sound.prototype.play = function(arg) {}184Sound.prototype.play = function*() {}185Sound.prototype.play = function*(arg) {}186Sound.prototype.play = async function() {}187Sound.prototype.play = async function(arg) {}188Sound.prototype.play = async function*() {}189Sound.prototype.play = async function*(arg) {}190Sound.prototype.play = async () => {}191Sound.prototype.play = async (arg) => {}192Sound.prototype.play = async arg => {}193Sound.prototype.play = () => {}194Sound.prototype.play = (arg) => {}195Sound.prototype.play = arg => {}196Sound.play = function() {}197Sound.play = function(arg) {}198Sound.play = function*() {}199Sound.play = function*(arg) {}200Sound.play = async function() {}201Sound.play = async function(arg) {}202Sound.play = async function*() {}203Sound.play = async function*(arg) {}204Sound.play = async () => {}205Sound.play = async (arg) => {}206Sound.play = async arg => {}207Sound.play = () => {}208Sound.play = (arg) => {}209Sound.play = arg => {}210play = function() {}211play = function(arg) {}212play = function*() {}213play = function*(arg) {}214play = async function() {}215play = async function(arg) {}216play = async function*() {}217play = async function*(arg) {}218play = async () => {}219play = async (arg) => {}220play = async arg => {}221play = () => {}222play = (arg) => {}223play = arg => {}224return function() {}225return function(arg) {}226return function*() {}227return function*(arg) {}228return async function() {}229return async function(arg) {}230return async function*() {}231return async function*(arg) {}232return async () => {}233return async (arg) => {}234return async arg => {}235return () => {}236return (arg) => {}237return arg => {}238return function play() {}239return function play(arg) {}240return function* play() {}241return function* play(arg) {}242return async function play() {}243return async function play(arg) {}244return async function* play() {}245return async function* play(arg) {}246yield genfunc;247yield* genfunc;248// Not matched as function definitions249Sound[play] = function(){}...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
