-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathindex.html
executable file
·398 lines (398 loc) · 97 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
<!DOCTYPE html>
<html ng-app="stremio" ng-keypress="keypress($event)">
<head>
<meta name="robots" content="noindex" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="google" content="notranslate" />
<link rel="icon" href="assets/images/stremio.ico" type="image/x-icon" />
<title>Stremio - Freedom to Stream</title>
<script type="text/ng-template" id="discoverTpl">
<div id="discover" ng-controller="discoverCtrl" ng-class="{ loading: loading }"><div id="discover-filter" spatial-nav-section="{ id: 'discover-filter', enterTo: 'default-element', defaultElement: '.spnav li.selected' }" spatial-nav-section-active="$state.includes('discover') && selectedEntry" class="filter"><ul ng-class="{spnav: sections.type }" class="type"><li ng-repeat="entry in getTypes()" ng-class="{ selected: isSelectedType(entry.catalog.type) }" ui-sref="discover({ transportUrl: entry.addon.transportUrl, type: entry.catalog.type, catalog: entry.id, genre: entry.defaultGenre })" tabindex="-1">{{::plural(entry.catalog.type)}}</li></ul><ul ng-class="{spnav: sections.catalog }" class="sort"><li ng-repeat="entry in getEntries() track by entry.uid" ng-class="{ selected: isSelectedEntry(entry) }" title="{{::translate(entry.name)}}" ui-sref="discover({ transportUrl: entry.addon.transportUrl, type: entry.catalog.type, catalog: entry.id, genre: entry.defaultGenre })" tabindex="-1">{{::translate(entry.name)}}</li></ul><ul ng-if="hasGenres(selectedEntry.catalog)" ng-class="{spnav: sections.genre }" class="genre-select scroll-pane scrolled"><li ng-if="selectedEntry.defaultGenre == null" ng-class="{ selected: isSelectedGenre(null) }" ui-sref="discover({ transportUrl: selectedEntry.addon.transportUrl, genre: null})" translate="DISCOVER_TOP" tabindex="-1"></li><li ng-repeat="genre in getGenreOptions(selectedEntry.catalog)" ng-class="{ selected: isSelectedGenre(genre) }" ui-sref="discover({transportUrl: selectedEntry.addon.transportUrl, genre: genre})" tabindex="-1">{{::translate(genre)}}</li></ul></div><div id="discover-holder" ng-class="{ full: messages.label }" spatial-nav-section="{ id: 'discover-holder', enterTo: 'default-element', defaultElement: '.item.selected' }" spatial-nav-section-active="$state.includes('discover')" class="holder"><ul id="discover-port" ng-class="resp.metas[0].posterShape" reached-viewport-end="resp.loadNextPage()" class="items scroll-pane"><div adult="!!selectedEntry.addon.manifest.behaviorHints.adult" class="adex-adview"></div><div ng-show="missingAddon" class="missing-addon"><div class="message">{{::translate("ERR_ADDON_NOT_INSTALLED")}}</div><a ng-click="openAddonsPage('discover', { addon: selectedEntry.addon.transportUrl})" class="install">{{::translate("ADDON_INSTALL")}}</a></div><div id="discover-backdrop" ng-show="messages.label"><div class="header">{{::translate("DISCOVER_WARNING_TITLE")}}</div><img ng-src="{{getMessageImage(messages.image)}}"><div class="info-text">{{translate(messages.label)}}</div><div ng-show="adultContent" onclick="window.history.back()" class="no-button">{{::translate("NO")}}</div><div ng-show="adultContent" ng-click="showContent()" class="yes-button">{{::translate("YES")}}</div><div ng-if="messages.promptRemoveAddon" ng-click="messages.promptRemoveAddon()" class="yes-button">{{::translate("UNINSTALL_THIS_ADDON")}}</div></div><div ng-show="!messages.label" class="group"><li ng-repeat="item in resp.metas track by item._id" ng-click="selectItem(item)" ng-class="{ inLib: libraryItem.byId[item.id], selected: item._id == info._id }" spatial-nav-enter="open({ metaItem: item })" spatial-nav-focus="$parent.info = item" tabindex="-1" class="item"><div class="name">{{::item.name}}</div><a class="thumb"><img stremio-image="::{ url: item.poster }"></a><div class="icon icon-ic_play button"></div><div ng-if="::item.featured" class="notification bottom"><div class="icon icon-ic_star"></div><a translate="DISCOVER_FEATURED"></a></div><div ng-if="::!item.featured && item.isInTheaterOnly()" class="notification bottom"><div class="icon icon-ic_star"></div><a translate="IN_THEATER"></a></div></li></div></ul></div><div ng-show="!!info && !adultContent" class="info-box"><div stremio-image="{ url: info.poster }" class="bkg"></div><div class="overlay"></div><div class="item-info"><div class="top-wrap"><div class="title"><h1>{{info.name}}</h1><ul ng-if="shouldOpenGenre(info.id)" class="genre"><li ng-repeat="genre in info.genres" ng-click="openGenre(genre, info.type)"><a ng-bind-html="genre | translate"></a></li></ul><ul ng-if="!shouldOpenGenre(info.id)" class="genre"><li ng-repeat="genre in info.genres"><span ng-bind-html="genre | translate"></span></li></ul></div><div ng-show="info.imdbRating" ng-click="openExternal('http://www.imdb.com/title/'+info.imdb_id)" class="rating"><div class="imdb-circle-label">{{ info.imdbRating | number:1 }}</div><div round-progress max="10" current="info.imdbRating" color="#94959E" bgcolor="#535563" radius="30" stroke="4" class="imdb-circle"></div><div title="{{:: translate('IMDB_RATING') }}" translate="IMDB_RATING" class="imdb-circle-text"></div></div></div><div ng-show="info.releaseInfo" class="year"><span translate="YEAR"></span><p>{{info.releaseInfo}}</p></div><div ng-show="info.director[0]" class="director"><span translate="DIRECTOR"></span><a ng-click="openActor(info.director[0])">{{info.director[0]}}</a></div><div ng-show="info.cast.length" class="lead-actors"><span translate="LEAD_ACTORS"></span><a ng-repeat="actor in info.cast" ng-click="openActor(actor)" class="actor">{{actor}}</a></div><div ng-show="info.description" class="summary"><span translate="SUMMARY"></span><p ng-bind-html="trustedHtml(info.descriptionHTML())"></p></div><ul ng-show="info.tvguide_short.length" class="tvguide"><li ng-repeat="item in info.currentTvGuide().slice(0,5)"><span>{{::item.starts | date:"HH:mm"}}</span><h4>{{::item.name}}</h4></li></ul></div><div ng-class="{ two: !info.trailers.length }" class="controls"><a ng-show="info.trailers.length" ng-click="openTrailer(info)" class="trailer button"><div class="icon icon-ic_movies"></div><span translate="TRAILER"></span></a><a ng-click="ifRegistered(libraryItem.addToLibrary, libraryItem, [info])" ng-hide="libraryItem.byId[info._id]" class="add-lib button"> <div class="icon icon-ic_addlib"></div><span translate="ADD_TO_LIB"></span></a><a ng-click="libraryItem.removeFromLibrary(info)" ng-show="libraryItem.byId[info._id]" class="remove-lib button"><div class="icon icon-ic_removelib"></div><span translate="REMOVE_FROM_LIB"></span></a><a ng-click="open({ metaItem: info })" class="show-info button"><div class="icon icon-ic_play"></div><span translate="SHOW"></span></a></div></div><span ng-show="loading" class="loader"><div class="loader2 loader2-center"><div class="loader-frame-1"></div><div class="loader-frame-2"></div><div class="loader-frame-3"></div><div class="loader-frame-4"></div></div></span></div>
</script>
<script type="text/ng-template" id="detailTpl">
<div id="detail" ng-cloak ng-controller="detailCtrl" ng-class="{visible: $state.is('detail')}" spatial-nav-section="{ id: 'detail', defaultElement: '#detail .defaultFocus', enterTo: 'default-element' }" spatial-nav-section-active="$state.includes('detail') && !settingsOpen"><div stremio-image="{ url: info.background }" class="cover"></div><div class="cover-overlay"><div ng-show="error" class="detail-error"><img ng-src="assets/images/discover-empty.png"><div class="info-text">{{translate(error)}}</div></div></div><div><div ng-controller="sidebarCtrl" ng-hide="loading" class="sidebar"><div class="sidebar-info-container"><div ng-show="showHead && (selected.item && info.videos < 2 || info.hasSeasons(info))" class="head"><div stremio-image="{ url: info.getLogo() }" class="logo"><div class="fallback">{{info.name}}</div></div><div class="year-rating-container"><div ng-show="info.year" class="year"><div translate="YEAR" class="title"></div><span>{{info.year}}</span></div><div ng-show="info.imdbRating" class="rating"><div translate="IMDB_RATING" class="title"></div><span>{{info.imdbRating.toFixed(1)}}</span></div></div></div><div ng-if="showStreamPicker()" spatial-nav-section="{ id: 'streamPicker', restrict: 'self-only', defaultElement: '.button.show-streams', enterTo: 'default-element'}" spatial-nav-section-active="showStreamPicker()" class="stream-picker"><section><span translate="SEASON" class="title"></span><number-picker min="0" ng-model="seasonPicker"></number-picker></section><section><span translate="EPISODE" class="title"></span><number-picker min="1" ng-model="episodePicker"></number-picker></section><section><div tabindex="-1" ng-click="showPickedStreams(seasonPicker, episodePicker)" class="button show-streams">{{ 'SIDEBAR_SHOW_STREAMS' | translate }}</div></section></div><div ng-if="showHead && displayType === 'movie'" class="movie-details"><div ng-show="info.genres.length" class="genre"><span translate="GENRE" class="title"> </span><div>{{info.genres.join(", ")}}</div></div><div ng-show="info.director.length" class="director"><span translate="DIRECTOR" class="title"></span><div>{{info.filterCrewNames(info.director, 3).join(", ")}}</div></div><div ng-show="info.writer.length" class="writer"><span translate="WRITER" class="title"></span><div>{{info.filterCrewNames(info.writer, 3).join(", ")}}</div></div><div ng-show="!!info.credits_cast" class="cast"><span translate="CAST" class="title"></span><ul class="scroll-pane"><li ng-repeat="c in info.filterDetailedCrew(info.credits_cast) track by c.id"><div class="name">{{::c.name}}</div><div class="character">as {{::c.character || c.jobs.join(" | ")}}</div></li></ul></div><div ng-show="info.description" class="description"><span translate="DESCRIPTION" class="title"></span><div>{{info.description}}</div></div></div><ul ng-if="displayType === 'tv'" class="tvguide"><li ng-repeat="item in info.currentTvGuide().slice(0,5)"><span>{{::selected.item.starts | date:"HH:mm"}}</span><h4>{{::selected.item.name}}</h4></li></ul><div ng-if="displayType === 'series'" class="episodes"><div ng-show="showReceiveNotifCheckbox()" ng-click="item.state.noNotif = !item.state.noNotif; item.save(); $event.stopPropagation();" class="showNotifs"><input type="checkbox" ng-checked="!item.state.noNotif"><span>{{item.type === 'series' ? 'DETAIL_RECEIVE_NOTIF_SERIES' : 'DETAIL_RECEIVE_NOTIF_VIDEOS' | translate}}</span></div><div ng-class="{ small: info.getSeasons().length < 20 }" class="season-chooser"><span translate="SEASONS" class="title"></span><ul><li ng-repeat="seasonNumber in info.getSeasons()" ng-click="sidebarSel.season = seasonNumber" ng-class="{selected: sidebarSel.season == seasonNumber}" ng-right-click="contextMenuSeason(item, info, seasonNumber, $event)" tabindex="-1">{{::seasonNumber}}</li><li ng-if="info.specialEpisodes.length" ng-click="sidebarSel.season = 0" ng-class="{selected: sidebarSel.season == 0}">{{::translate('special')}}</li></ul></div><ul class="episodes-list scroll-pane fullHeight"><li ng-repeat="episode in episodesBySeason(info, sidebarSel.season) | orderBy:"number" track by episode._id" ng-click="open({ libItem: item, metaItem: info, video: episode, intent: 'player' })" ng-class="getVidClasses(item, episode)" ng-right-click="!isUpcoming(episode) && contextMenuVideo(item, info, episode, $event)" title="{{episode.title ? episode.title+': ' : ''}}{{episode.season ? 'Season ' + episode.season : 'special' }}, Episode {{episode.episode}}" tabindex="-1"><span class="ep-numb">{{::episode.episode}}</span><span class="ep-name">{{::episode.title || "TBA"}}</span><span title="Available offline" class="offline-indicator"></span><span ng-show="isUpcoming(episode)" timestamp-to-date="episode.released.getTime()" class="date"></span><span ng-show="hasMissingDate(episode) && !hasStreams(episode)" class="icon icon-ic_ghost"></span></li></ul></div><div ng-class="{ noThumb: info.videos[0] && !info.videos[0].thumbnail }" ng-if="displayType === 'channel'" class="uploads"><div ng-show="showReceiveNotifCheckbox()" ng-click="item.state.noNotif = !item.state.noNotif; item.save(); $event.stopPropagation();" class="showNotifs"><input type="checkbox" ng-checked="!item.state.noNotif"><span>{{item.type === 'series' ? 'DETAIL_RECEIVE_NOTIF_SERIES' : 'DETAIL_RECEIVE_NOTIF_VIDEOS' | translate}}</span></div><div><input ng-model="info.search" placeholder="{{ 'SEARCH_VIDEOS' | translate }}" ng-focus="onInputFocus()" ng-blur="onInputBlur()" class="search"><div class="icon icon-ic_search icon-search"></div></div><ul scroll-pane-to="li.playing" class="episodes-list scroll-pane fullHeight"><li ng-repeat="video in info.videos | filter:info.search | orderBy:reverse:'released' track by video._id" ng-class="getVidClasses(item, video)" ng-click="open({ libItem: item, metaItem: info, video: video, intent: 'player' })" ng-right-click="contextMenuVideo(item, info, video, $event)" title="{{::video.title}}" tabindex="-1"><div class="item"><img stremio-image="::{ url: video.thumbnail }" class="vid-thumb"><span class="vid-name">{{::video.title}}</span><span ng-if="::video.released.getTime()" class="vid-date">{{::video.released | date:"d MMM yyyy"}}</span></div></li></ul></div></div><div stream-select-scroll ng-show="currentStreamsView()" class="streams-inline"><div ng-show="showProgress" class="streams-loader"><div class="progress-bar-header">{{loadingAddonsCount === 1 ? 'add-on ' + (loadingAddonsNames + ' is still loading') : (loadingAddonsCount + ' add-ons are still loading')}}</div><div class="progress-bar"></div></div><div ng-class="{ shown: currentStreamsView() && (selected.video.season || selected.video.title) }" class="streams-eptitle">{{selected.video.season ? (selected.video.season + 'x' + selected.video.episode + ' - ' + selected.video.title) : selected.video.title}} </div><div ng-class="{ shown: showStreamPicker() }" class="streams-eptitle">{{ 'SEASON' | translate }} {{ seasonPicker }} x {{ 'EPISODE' | translate }} {{ episodePicker }}</div><div ng-if="info.isInTheaterOnly()" class="movie-notavailable"><div class="icon icon-ic_cinema"></div><h3 translate="STILL_IN_THEATER"></h3><h4 translate="WATCH_IN_CINEMA"></h4><div ng-show="info.externalUrls.cinema" ng-click="openExternal(info.externalUrls.cinema)" class="button-b cinema-tickets defaultFocus"><span class="icon icon-ic_cinema"></span><span translate="GET_TICKETS"></span></div></div><div ng-if="selected.video" ng-show="isUpcoming(selected.video)" class="ep-details upcomming"><div class="icon icon-ic_hourglass_tilted"></div><div class="text-container"><div translate="UPCOMING_EPISODE" class="title"></div><div class="message">{{ 'UPCOMING_EPISODE_MESSAGE' | translate }} {{ ' ' }}<span timestamp-to-date="selected.video.released.getTime()" class="date"></span></div></div></div><div ng-show="hasMissingDate(selected.video)" class="ep-details missingdate"><div class="icon icon-ic_ghost"></div><div class="text-container"><div translate="MISSING_DATE_EPISODE" class="title"></div><div translate="MISSING_DATE_EPISODE_MESSAGE" class="message"></div></div></div><div ng-show="streams.length || isStreamsView('noStreams')" class="streams-list scroll-pane streams-scroll"><div ng-show="isStreamsView('noStreams')" translate="{{::'NO_STREAM'}}" class="streams-title streams-no-stream">{{::'NO_STREAM'}}</div><ul class="streams"><li ng-repeat="streamItem in streams" ng-class="::{ inactive: item.stream.isGeoRestricted() }" title="{{::translate(item.stream.isGeoRestricted() ? 'ADDON_STREAM_GEORESTRICTED' : '')}}" ng-click="pickStream(streamItem.stream)" tabindex="-1" class="stream-item"><div class="streams-holder defaultFocus"><div class="streams-container"><div class="streams-name"><span class="text-middle">{{::displayName(streamItem.stream, streamItem.addon) | translate}}</span></div><div class="streams-quality"><div class="text-middle"><div class="show"><div class="res">{{::streamItem.stream.displayTitle().split(', ').join('\n')}}</div><span ng-class="{ shown: !!streamItem.stream.displaySubtitle() }"><span ng-class="{ highlight: translate(streamItem.stream.displaySubtitle()) == 'free', yellow: translate(streamItem.stream.displaySubtitle()) == 'subscription' }">{{!!streamItem.stream.displaySubtitle() ? translate(streamItem.stream.displaySubtitle()).toUpperCase() : ''}}</span></span></div></div></div></div><div class="streams-play"><img src="assets/images/play-resume.svg"><div ng-if="streamItem.stream.identifier() == selected.lastStreamId" class="resume-stream"><div current="::2 + (item.state.timeOffset / item.state.duration * 100)" color="#b174d7" round-progress max="100" bgcolor="rgba(0,0,0,0.2)" radius="10" stroke="1.5" responsive="true" no-listen="true"></div></div></div></div><div style="clear: both"></div></li></ul><div class="addons-catalogue-link streams-addons-button shown"><a translate="ADDON_CATALOGUE" tabindex="-1" ng-click="openAddonsPage('stream-select', { cat: 'community', type: $state.params.type })"></a></div></div></div></div></div><div ng-class="{ hidden: moreInfo }" ng-hide="loading" class="details-less-info"><div class="details-top"><div ng-if="!info.logo && !getFeaturedVid()" class="logo"><h1>{{info.name}}</h1></div><div ng-show="info.logo && info.logoShape != 'hidden'" class="logo"><img ng-src="{{info.logo}}" alt="{{info.name}}" style="height: 100%;" onerror="this.className='missing'"></div><div ng-show="getFeaturedVid()" class="logo"><img ng-src="{{getFeaturedVid().thumbnailMax}}" ng-click="open({ libItem: item, video: getFeaturedVid(), intent: 'player' })" style="height:calc(100% - 20px);cursor:pointer"><div>{{getFeaturedVid().title}}</div></div><div class="holder"><ul ng-if="sharing.getShareUrl({ item: item, inf: info })" class="share"><li ng-click="sharing.sendShare({ item: item, inf: info, type: 'facebook' })" class="icon icon-ic_facebook"></li><li ng-click="sharing.sendShare({ item: item, inf: info, type: 'twitter' })" class="icon icon-ic_twitter"></li><!--li.tumblr--><li ng-click="sharing.sendShare({ item: item, inf: info, type: 'copylink' })" class="icon icon-ic_link"></li></ul><div class="actionButtons"><div ng-show="info.trailers.length" ng-click="openTrailer(info)" title="{{translate('WATCH_TRAILER')}}" tabindex="-1" class="button-b trailer"><span translate="WATCH_TRAILER" class="icon icon-ic_movies"></span></div><div ng-if="item.type != 'other' && !libraryItem.byId[item._id]" ng-click="ifRegistered(libraryItem.addToLibrary, libraryItem, [info])" title="{{translate('ADD_TO_LIB')}}" tabindex="-1" class="button-b add-lib"><span translate="ADD_TO_LIB" class="icon icon-ic_addlib"></span></div><div ng-if="item.type != 'other' && libraryItem.byId[item._id]" ng-click="libraryItem.removeFromLibrary(info)" title="{{translate('REMOVE_FROM_LIB')}}" tabindex="-1" class="button-b remove-lib"><span translate="REMOVE_FROM_LIB" class="icon icon-ic_removelib"> </span></div></div></div></div><div ng-class="detailsClasses()" class="details-bottom"><ul><li>{{info.runtime}}</li><li>{{info.releaseInfo}}</li><li ng-show="info.imdbRating && info.imdbRating != '0.0'" ng-click="openExternal('http://www.imdb.com/title/'+info.imdb_id)" class="external"><i class="icon icon-ic_imdb"></i><span>{{ info.imdbRating == '0.0' ? '-' : (info.imdbRating | number:1) }}</span></li></ul><div ng-if="shouldOpenGenre(info.id)" class="genre title-content"><a ng-repeat="genre in info.genres" ng-click="openGenre(genre, 'movie')" ng-bind-html="genre | translate"></a></div><div ng-if="!shouldOpenGenre(info.id)" class="genre title-content"><span ng-repeat="genre in info.genres" ng-bind-html="genre | translate"></span></div><div ng-show="info.director.length"><div translate="DIRECTOR" class="title"></div><div class="title-content"><a ng-repeat="director in info.director" ng-click="openActor(director)" class="director">{{::director}}</a></div></div><div ng-show="info.cast.length"><div translate="CAST" class="title"></div><div class="title-content"><a ng-repeat="actor in info.cast" ng-click="openActor(actor)" class="actor">{{::actor}}</a></div></div><div ng-if="!shouldShowMore() && info.description"><div translate="SUMMARY" class="title"></div><div title="{{info.description}}" ng-bind-html="info.descriptionHTML()" class="title-content"></div></div></div><div ng-click="switchPage(true)" ng-if="shouldShowMore()" class="details-more">{{::translate("SHOW_MORE")}} +</div></div><div ng-class="{ shown: moreInfo }" class="details-more-info"><div ng-class="{ shown: info.credits_crew && info.credits_crew.length }" class="details-people details-crew"><span class="title">{{::translate("CREW")}}</span><ul ng-if="moreInfo"><li ng-repeat="crew in info.credits_crew | limitTo:4" ng-click="openActor(crew.name)"><div stremio-image="{ url: "http://image.tmdb.org/t/p/w154" + crew.profile_path }" class="people-image"></div><div class="people-name">{{crew.name}}</div><div class="people-job">{{crew.job}}</div></li></ul></div><div ng-class="{ shown: info.credits_crew && info.credits_crew.length > 4 }" class="details-people details-cast"><span class="title">{{translate('CAST')}}</span><ul ng-if="moreInfo"><li ng-repeat="cast in info.credits_cast.slice(4, 8) | limitTo:4" ng-click="openActor(cast.name)"><div stremio-image="{ url: "http://image.tmdb.org/t/p/w154" + cast.profile_path }" class="people-image"></div><div class="people-name">{{cast.name}}</div></li></ul></div><div class="details-summary"><div ng-class="{ extended: !info.similar && !info.videos.length }" class="summary"><span class="title">{{selected.video.name || translate('SUMMARY')}}</span><p ng-bind-html="selected.video.overview || trustedHtml(info.descriptionHTML())" class="episode-desc"></p></div></div><div ng-click="switchPage(false)" class="details-more">{{::translate("SHOW_LESS")}} -</div></div><span ng-show="loading" class="loader"><div class="loader2 loader2-center"><div class="loader-frame-1"></div><div class="loader-frame-2"></div><div class="loader-frame-3"></div><div class="loader-frame-4"></div></div></span></div>
</script>
<script type="text/ng-template" id="boardTpl">
<div id="board" ng-controller="boardCtrl" spatial-nav-section="{ id: 'board', straightOnly: true, enterTo: 'default-element', defaultElement: '#board .selected' }" spatial-nav-section-active="$state.includes('board') && !settingsOpen"><div class="board-container-wrapper"><ul board-carousel-holder="true" class="board-container board-4-container scroll-pane"><li ng-repeat="category in groups track by category.id" ng-focused="false" ng-class="{ 'board-notif-holder': !!category.notifs }"> <div ng-if="!category.showExplanation()" board-carousel-arrow="right"></div><div ng-if="!category.showExplanation()" board-carousel-arrow="left"></div><div ng-if="::category.libItems.length" class="board-row-icon icon icon-ic_continue"></div><div ng-if="::category.notifs.length && category.level == LEVELS.ITEM" stremio-image="::{ type: 'poster', _id: category.notifs[0].item_id }" class="board-row-icon poster"></div><div ng-if="::category.notifs.length && category.level != LEVELS.ITEM" ng-bind="category.notifs.length" class="board-row-icon notif-counter"></div><div ng-if="category.level == LEVELS.ADDON && category.addon.manifest.icon" ng-style="::{ 'background-color': '#eee', '-webkit-mask-image': 'url('+category.addon.manifest.icon+')' }" class="board-row-icon board-row-icon-addon icon logo-icon"></div><h2 ng-class="::getHeadlineClasses(category)" ng-click="onHeadlineClick(category)" class="board-headline"><span>{{::category.name | translate}}</span> <span ng-if="::category.subname">- {{::category.subname}}</span></h2><div ng-if="::category.notifs.length" ng-click="dismissAll(category)" ng-translate class="board-dismiss-notifs button"> <span translate="BUTTON_DISMISS_ALL"></span><span class="icon icon-ic_x"></span></div><ul ng-if="::category.libItems.length" class="items board-row recent-board"><li ng-repeat="item in category.libItems track by item._id" ng-click="$root.info = item; open({ libItem: item })" ng-class="[item.posterShape || posterShape(item.type), { selected: item._id == info._id }]" spatial-nav-enter="open({ libItem: item, intent: 'player', rememberStream: true })" tabindex="-1" class="resume"><div class="name">{{::item.name}}</div><div ng-click="$root.info = item; open({ libItem: item }); $event.stopPropagation()" class="thumb"><img stremio-image="::{ type: "poster", _id: item._id }"><div title="{{::translate('LIBRARY_RESUME')+' '+item.name }}" class="resumer"><div class="resume-holder"><div ng-click="open({ libItem: item, intent: "player", rememberStream: true }); $event.stopPropagation()" class="resume-container"><div class="resume-dummy"></div><div class="resume-button"><a title="{{::translate('LIBRARY_RESUME_DISMISS') }}" ng-click="item.state.timeOffset = 0; item.save(); $event.stopPropagation()" class="close-holder"><div class="close icon-ic_reset"></div></a><div class="resume-in-circle"><img src="assets/images/play-resume.svg"></div><div current="item.state.duration ? 2 + (item.state.timeOffset / item.state.duration * 100) : 0" color="#7f4d9e" round-progress max="100" bgcolor="transparent" radius="10" stroke="1.5" responsive="true" no-listen="true"></div></div></div></div></div></div></li></ul><ul ng-if="::category.notifs.length" board-carousel="!category.showExplanation()" reached-viewport-end="category.loadMore()" class="board-row board-notif"><li ng-repeat="notif in category.shown() | orderBy:sortTimeDesc track by notif._id" ng-class="{ dismissed: notif.dismissed, clickable: notif.full_clickable && notif.external_url, 'no-title': category.level == LEVELS.ITEM }" ng-click="notif.full_clickable && notif.external_url && openExternal(notif.external_url)" spatial-nav-enter="notif.getPlayArgs() && open({ notifItem: notif, intent: 'player' })" tabindex="-1" class="notif"><div stremio-image="::{ url: notif.background }" class="placeholder"></div><div stremio-image="::{ url: notif.getBackground() }" class="thumb"><a ng-click="notif.dismissed = true; notif.save(); $event.stopPropagation();" class="close icon-ic_x"></a><div ng-if="::category.showControls()" class="controls"><div class="buttons"><a ng-show="::!!notif.getPlayArgs()" ng-click="open({ notifItem: notif, intent: "player" })"><div class="icon icon-ic_play"></div></a><a ng-show="::notif.external_url" ng-click="openExternal(notif.external_url)" title="{{:: notif.call_to_action || '' }}" class="show-info"><div class="icon icon icon-ic_ellipsis"></div></a><a ng-show="::!!notif.getItemMeta()" ng-click="open({ metaItem: notif.getItemMeta(), intent: "detail" })" class="show-info"><div class="icon icon icon-ic_ellipsis"></div></a></div></div></div><div class="info"><div class="title">{{::notif.title}}</div><div ng-show="::category.level != LEVELS.ITEM" class="name">{{::notif.name}}</div></div></li><li ng-if="isUserNew() && category.showExplanation()" style="overflow: visible" class="board-explanation"><div class="bubble-notif"><div class="bubble-icon {{::explains[category.id].icon}}"></div><div ng-bind-html="::translate(explains[category.id].message)" class="bubble-message"></div></div></li></ul></li><li ng-repeat="result in results track by result.uid" ng-focused="false" ng-if="result.response && result.metas && result.metas.length && !result.addon.manifest.behaviorHints.noBoard && !result.addon.manifest.behaviorHints.adult"> <div board-carousel-arrow="right"></div><div board-carousel-arrow="left"></div><h2 class="board-headline">{{::plural(result.type)}} - {{::(result.catalog.name || result.addon.manifest.name)}}</h2><p class="view-all"> <a ui-sref="discover({ transportUrl: result.addon.transportUrl, type: result.type, catalog: result.id, genre: null })" translate="BUTTON_VIEW_ALL"></a></p><ul ng-if="result.metas && result.metas.length" board-carousel="true" class="items board-row {{ result.metas[0].posterShape }}"><li ng-repeat="item in result.metas track by item._id" ng-click="$root.info = item;open({ metaItem: item })" ng-class="{ selected: item._id == info._id }" tabindex="-1" class="hide-controls board-item no-title"><div class="name board-item-name">{{::item.name}}</div><div class="thumb"><img stremio-image="::{ url: item.poster }"><div ng-if="::libraryItem.byId[item._id].state.timesWatched >= 1" class="notification watched"><div class="icon icon-ic_check"></div></div><div ng-if="::item.featured" class="notification bottom"><div class="icon icon-ic_check"></div><a translate="DISCOVER_FEATURED"></a></div><div ng-if="::!item.featured && item.isInTheaterOnly() && !item.inTheaterGroup" class="notification bottom"><div class="icon icon-ic_star"></div><a translate="IN_THEATER"></a></div></div><div class="info"><div class="title">{{::item.name}}</div></div></li></ul></li></ul></div></div>
</script>
<script type="text/ng-template" id="calendarTpl">
<div id="calendar" ng-controller="calendarCtrl" ui-sref-active="calendar" spatial-nav-section="{ id: 'calendar', straightOnly: true, straightOverlapThreshold: .1 }" spatial-nav-section-active="$state.includes('calendar') && !settingsOpen"><div ng-show="emptyLib() && view != 'board'" ng-cloak ng-class="::{ 'board-holder': view == 'board' }" class="empty-library ng-hide"><div ng-show="view == 'calendar' || view == 'library'" ng-style="{ 'background-image': 'url(https://'+WEB_DOMAIN+'/images/'+view+'-blurred.png)', opacity: view=='calendar' ? 0.6 : 0.3 }" class="background"></div><div class="holder"><span ng-show="view == 'library'"><h2 translate="LIB_EMPTY" style="opacity: 0.5"></h2><h3 ng-show="emptyLib() && API.user" translate="HOW_START"></h3><h3 ng-show="!API.user" translate="LIB_EMPTY_ALL"></h3></span><span ng-show="view == 'calendar'"><h2 ng-show="API.user" translate="LIB_EMPTY_CAL"></h2><h3 ng-show="API.user" translate="HOW_START_CAL"></h3><h2 ng-show="!API.user" translate="LIB_EMPTY_OTHER"></h2></span><ul ng-show="!API.user" ui-sref="intro({ goToSignUp: true })" class="four"><li><div class="icon icon-ic_cloud"></div><div translate="LIB_EMPTY_CLOUD" class="title"></div><div translate="LIB_EMPTY_CLOUD_DESC" class="label"></div></li><li><div class="icon icon-ic_highspeaker"></div><div translate="LIB_EMPTY_EARLY" class="title"></div><div translate="LIB_EMPTY_EARLY_DESC" class="label"></div></li><li><div class="icon icon-ic_person"></div><div translate="LIB_EMPTY_PERSONAL" class="title"></div><div translate="LIB_EMPTY_PERSONAL_DESC" class="label"></div></li><li><div class="icon icon-ic_calendar"></div><div translate="CALENDAR" class="title"></div><div translate="LIB_EMPTY_CALENDAR_DESC" class="label"></div></li></ul><ul ng-show="API.user" class="four"><li ng-click="settings.fbImport()"><div class="icon icon-ic_facebook"></div><div ng-bind-html="'IMPORT_FB' | translate" class="label"></div></li><li ng-click="settings.traktConnect()"><div class="icon icon-ic_trakt"></div><div ng-bind-html="'IMPORT_TRAKT' | translate" class="label"></div></li><li ng-click="openGenre(null)"><div class="icon icon-ic_discover"></div><div ng-bind-html="'IMPORT_DISCOVER' | translate" class="label"></div></li><li ng-click="addLocalAddon()"><div class="icon icon-ic_folder"></div><div ng-bind-html="'IMPORT_DISK' | translate" class="label"></div></li></ul></div></div><div id="series-calendar" ng-hide="emptyLib()"><div class="selectMonth"><ul><li ng-hide="showPrevMonth()" class="hide">{{translate(monthLabel(-1))}}</li><li ng-click="showPrevMonth() && incrementMonth(-1)" ng-if="showPrevMonth()" tabindex="-1" class="previous"><label>{{translate(monthLabel(-1))}}</label></li><li class="current"><label>{{translate(monthLabel(0))}}</label></li><li ng-hide="showNextMonth()" class="hide">{{translate(monthLabel(1))}}</li><li ng-click="showNextMonth() && incrementMonth(1)" ng-if="showNextMonth()" tabindex="-1" class="next"><label>{{translate(monthLabel(1))}}</label></li></ul></div><ul class="days"><li ng-repeat="day in dayLabels" translate="{{::day}}" class="label">{{::day}}</li></ul><ul ng-class="{ morerows: cal.days.length+cal.pads.length > 7*5 }" class="month"><li ng-repeat="pad in cal.pads" class="pad"></li><li ng-repeat="day in cal.days track by $id(day.date)" ng-class="{ today: day.today, selected: day.date==cal.selected }" ng-click="selectedDay(day.date)" tabindex="-1" autofocus="day.date == cal.selected" class="day"><div class="date"> <span>{{::day.date}}</span></div><div ng-show="::day.episodes.length>3 && day.episodes.length<10" class="more">+{{::day.episodes.length-3}}</div><div ng-show="::day.episodes.length-3 > 9" class="more">9+</div><!--div.episode(ng-repeat="ep in day.episodes") {{::ep.names[ep.names.length-1]}}--><div class="ep-holder"><div ng-repeat="ep in day.episodes | limitTo: 3" ng-class="::{ available: ep.available }" class="episode"><div ng-style="{ "background-image": "url("+$root.libraryItem.byIdAll[ep.imdb_id].poster+")" }" ng-click="selectedDay(day.date); expandEpisode(ep);" class="thumb"></div></div></div></li></ul></div><div id="future-episodes" ng-hide="emptyLib()"><div class="port scroll-pane"><ul><span ng-repeat="(airDate, group) in itemsByDate" ng-click="selectDate(airDate)" ng-class="{ today: isSameDay(airDate), selected: isSelectedDay(airDate) }"><li data-airdate="{{airDate}}" class="date">{{ airDate | date:'MMM d' }}</li><li ng-repeat="item in group | orderBy:['firstAired','number']" ng-class="{ available: item.available, active: cal.selectedItem == item }" ng-click="cal.selectedItem = item" spatial-nav-focus="cal.selectedItem = item" tabindex="-1" spatial-nav-enter="open({ libItem: { _id: item.imdb_id, type: item.type }, video: { _id: item.imdb_id+':'+item.season+':'+item.number }, intent: 'player' })" class="episode"><span ng-show="::item.type=='episode'"><div class="seriesName">{{::item.names[0]}}</div><div class="epNumber">{{::item.season.length ? item.season : 'S'+item.season}} E{{::item.number}}</div><div ng-show="cal.selectedItem == item" class="name">"{{::item.names[item.names.length - 1]}}"</div><div ng-show="cal.selectedItem == item" class="overview"> {{::item.overview}}</div><div ng-show="cal.selectedItem == item && item.available" ng-click="openEpisode(item, 'player')" class="button play"><div class="play-icon"></div><span>▶ <label translate="WATCH_NOW"></label></span></div><div ng-show="cal.selectedItem == item && !item.available" ng-click="openEpisode(item, 'detail')" class="button play"><div class="play-icon"></div><span>▶ <label translate="SHOW"></label></span></div><div ng-show="cal.selectedItem == item && !item.available && item.trailer" ng-click="$state.go('player.trailer', { id: item.imdb_id, tid: item.trailer })" class="button play"><div class="play-icon"></div><span>▶ <label translate="WATCH_TRAILER"></label></span></div></span><span ng-show="::item.type=='movie'"><div class="seriesName">{{::item.names[0]}}</div><div ng-show="cal.selectedItem == item" class="name"> </div><div ng-show="cal.selectedItem == item" style="margin-top: 10px;" ng-click="open({ libItem: { _id: item.imdb_id, type: item.type } })" class="play"><span translate="SHOW_MOVIE"></span></div></span></li></span></ul></div></div></div>
</script>
<script type="text/ng-template" id="libraryTpl">
<li id="library" ng-controller="libraryCtrl" ui-sref-active="library"><div ng-show="emptyLib() && view != 'board'" ng-cloak ng-class="::{ 'board-holder': view == 'board' }" class="empty-library ng-hide"><div ng-show="view == 'calendar' || view == 'library'" ng-style="{ 'background-image': 'url(https://'+WEB_DOMAIN+'/images/'+view+'-blurred.png)', opacity: view=='calendar' ? 0.6 : 0.3 }" class="background"></div><div class="holder"><span ng-show="view == 'library'"><h2 translate="LIB_EMPTY" style="opacity: 0.5"></h2><h3 ng-show="emptyLib() && API.user" translate="HOW_START"></h3><h3 ng-show="!API.user" translate="LIB_EMPTY_ALL"></h3></span><span ng-show="view == 'calendar'"><h2 ng-show="API.user" translate="LIB_EMPTY_CAL"></h2><h3 ng-show="API.user" translate="HOW_START_CAL"></h3><h2 ng-show="!API.user" translate="LIB_EMPTY_OTHER"></h2></span><ul ng-show="!API.user" ui-sref="intro({ goToSignUp: true })" class="four"><li><div class="icon icon-ic_cloud"></div><div translate="LIB_EMPTY_CLOUD" class="title"></div><div translate="LIB_EMPTY_CLOUD_DESC" class="label"></div></li><li><div class="icon icon-ic_highspeaker"></div><div translate="LIB_EMPTY_EARLY" class="title"></div><div translate="LIB_EMPTY_EARLY_DESC" class="label"></div></li><li><div class="icon icon-ic_person"></div><div translate="LIB_EMPTY_PERSONAL" class="title"></div><div translate="LIB_EMPTY_PERSONAL_DESC" class="label"></div></li><li><div class="icon icon-ic_calendar"></div><div translate="CALENDAR" class="title"></div><div translate="LIB_EMPTY_CALENDAR_DESC" class="label"></div></li></ul><ul ng-show="API.user" class="four"><li ng-click="settings.fbImport()"><div class="icon icon-ic_facebook"></div><div ng-bind-html="'IMPORT_FB' | translate" class="label"></div></li><li ng-click="settings.traktConnect()"><div class="icon icon-ic_trakt"></div><div ng-bind-html="'IMPORT_TRAKT' | translate" class="label"></div></li><li ng-click="openGenre(null)"><div class="icon icon-ic_discover"></div><div ng-bind-html="'IMPORT_DISCOVER' | translate" class="label"></div></li><li ng-click="addLocalAddon()"><div class="icon icon-ic_folder"></div><div ng-bind-html="'IMPORT_DISK' | translate" class="label"></div></li></ul></div></div><ul ng-show="!emptyLib()" spatial-nav-section="{ id: 'library-nav', defaultElement: '.lib-type > .selected', enterTo: 'default-element' }" spatial-nav-section-active="$state.includes('library') && !emptyLib()" class="lib-type"><li ng-repeat="type in getTypes()" ui-sref="library.type({ type: type })" ui-sref-active-eq="selected" tabindex="-1">{{plural(type)}}</li></ul><div class="sort-filter"><div tabindex="-1" ng-show="!emptyLib()" ng-click="swapOrder = !swapOrder" class="button button-s lib-sort-swap"><div ng-show="swapOrder" class="icon icon-ic_sort_up"></div><div ng-show="!swapOrder" class="icon icon-ic_sort_down"></div></div><div ng-show="!emptyLib()" tabindex="-1" class="custom-select lib-sort"><div class="icon icon-ic_arrow_thin_down"></div><select name="selectedorder" ng-model="selectedorder" ng-change="updateSortorder()" class="lib-sort-select"> <option ng-repeat="order in sortorders" value="{{order}}" title="{{order}}">{{translate("SORT_BY") + ' ' + translate(order)}}</option></select></div></div><ul id="library-port" ng-show="libraryLoaded" ng-class="posterShape(selected.type())" spatial-nav-section="{ id: 'library', defaultElement: '#library-port > .selected', enterTo: 'default-element' }" spatial-nav-section-active="$state.includes('library')" class="items"><li ng-repeat="item in items() | orderBy:[sortorder]:swapOrder track by item._id" ng-right-click="contextMenu(item, $event)" ng-click="$parent.info = item; open({ libItem: item })" ng-class="{ selected: item._id == info._id }" tabindex="-1"><div class="name">{{::item.name}}</div><div class="thumb"><img stremio-image="::{ type: "poster", _id: item._id }"><div ng-if="!!item.state.timeOffset"><div title="{{::translate('LIBRARY_RESUME')+' '+item.name }}" class="resumer"><div class="resume-holder"><div ng-click="open({ libItem: item, intent: "player", rememberStream: true }); $event.stopPropagation()" class="resume-container"><div class="resume-dummy"></div><div class="resume-button"><a title="{{::translate('LIBRARY_RESUME_DISMISS') }}" ng-click="item.state.timeOffset = 0; item.save(); $event.stopPropagation()" class="close-holder"><div class="close icon-ic_reset"></div></a><div class="resume-in-circle"><img src="assets/images/play-resume.svg"></div><div current="item.state.duration ? 2 + (item.state.timeOffset / item.state.duration * 100) : 0" color="#7f4d9e" round-progress max="100" bgcolor="transparent" radius="10" stroke="1.5" responsive="true" no-listen="true"></div></div></div></div></div></div><div ng-if="libraryItem.byId[item._id].state.timesWatched >= 1" class="notification watched"><div class="icon icon-ic_check"></div></div><div ng-if="notifType(item) == 'new-video'" title="Play new {{::item.type == 'series' ? 'episode' : 'video'}}" ng-click="open({ libItem: item })" class="notification bottom"><a>{{:: "new "+(item.type=="series" ? "episode" : "video") | translate }}</a></div></div></li></ul></li>
</script>
<script type="text/ng-template" id="searchTpl">
<div id="search" ng-controller="searchCtrl" style="overflow: hidden;" spatial-nav-section="{ id: 'search', enterTo: 'default-element', defaultElement: '#search .selected' }" spatial-nav-section-active="$state.includes('search') && !userMenuOpen"><h2 ng-show="search.query && noResults" translate="SEARCH_NO_RESULTS" class="noResults"></h2><div id="board"><ul board-carousel-holder="true" class="board-container board-4-container scroll-pane"><li ng-repeat="result in results track by result.uid" ng-focused="false" ng-if="result.response && result.metas && result.metas.length"><div board-carousel-arrow="right"></div><div board-carousel-arrow="left"></div><h2 class="board-headline">{{::translate(result.type)}} - {{::result.addon.manifest.name+catalogName(result)}}</h2><ul board-carousel="true" class="items board-row {{ result.metas[0].posterShape }}"><li ng-repeat="item in result.metas track by item._id" ng-click="$root.info = item;openSearchItem(item)" ng-class="{ selected: item._id == info._id }" tabindex="-1" class="hide-controls board-item"><div class="thumb"><img stremio-image="::{ url: item.poster }"></div><div class="info"><div class="title">{{::item.name}}</div></div></li></ul></li></ul></div></div>
</script>
<script type="text/ng-template" id="playerTpl">
<div id="player" ng-init="play()" ng-controller="playerCtrl" ng-cloak ng-dblclick="toggleFullscreen()"><div id="drag" style="position: absolute; left: 100px; right: 150px; height: 40px; top: 0px; -webkit-app-region: drag;"></div><div class="hidable hidden player-handle"><div ng-click="playerGoBack()" class="tab player-back"><div class="icon icon-ic_back_ios"></div><span translate="BACK"></span></div><div id="windowTitle"><span class="content">{{selected.item.title(info)}}</span></div></div><div id="loading-background" ng-show="show("watch-from") || show("loading") || show("error") || show("device")" stremio-image="{ url: info.getBackground() }"></div><div id="loading" ng-show="show("loading") || show("buffering")"><div ng-controller="loadingBarCtrl"><div id="loading-logo" ng-class="{ hide: stats || selected.item.type=='channel' }" stremio-image="{ url: info.getLogo() }"><div class="fallback"><h2>{{selected.item.name}}</h2></div></div><div id="player-timeout" ng-show="poorConnection == true"><div class="icon icon-ic_broken_link"></div><span translate="POOR_SOURCE"></span></div><div id="slow-loading" ng-show="slowLoading == true"><div translate="SLOW_LOADING"></div><div><button ng-click="goBack()" translate="I_GIVE_UP" class="button button-s"></button></div><div class="faq"></div><a target="_blank" ng-href="https://{{WEB_DOMAIN}}/faq#streaming-server-not-found" translate="LEARN_MORE" class="button link"></a></div></div></div><div id="player-error" ng-show="show('error')" ng-click="goBack()"><div class="err-container"><div id="player-fallback" ng-show="playbackError.code==3 || playbackError.code==10"><h2>{{playbackError.message || translate("PLAYER_PLAYBACK_ERROR_DEFAULT", {productName: PRODUCT_NAME})}}</h2></div><h2 ng-hide="playbackError.code==3">{{playbackError.message || playbackError}}<a ng-show="playbackError.STREAMING_SERVER" target="_blank" ng-href="https://{{WEB_DOMAIN}}/faq#streaming-server-not-found"><span class="icon icon-info-circle"></span></a></h2></div></div><div id="device-message" ng-show="show('device')"><span translate="CASTING_TO"></span> {{player.getExternalDevice().typeName}} - {{player.getExternalDevice().name}}</div><div id="streamReport" ng-class="{ visible: stats }" class="modal"><!--.close.thin--><div class="icon icon-ic_p2p"></div><h2 translate="NETWORK_STATUS" class="purple"></h2><h2 class="white"><label translate="STREAM_SPEED"> </label><span class="speed"></span></h2><h2 class="white"><label translate="STREAM_BUFFERED"> </label><span class="buffered"></span></h2><h2 translate="PEERS_INFO" class="purple"></h2><ul><li><label translate="PEERS_ACTIVE"></label><span class="activePeers"></span></li><li><label translate="PEERS_CONNECTED"></label><span class="connectedPeers"></span></li><li><label translate="PEERS_WAITING"></label><span class="waitingPeers"></span></li></ul><div class="streamInfo"><div ng-show="selected.stream.infoHash">infoHash # {{selected.stream.infoHash}}</div><div ng-show="selected.transcodeWarning" translate="TRANSCODING_WARNING"></div></div></div><div id="controlbar" ng-show="selected.item && selected.loaded" ng-dblclick="$event.stopPropagation()" ng-click="$event.stopPropagation()" class="hidable hidden"><input type="range" ng-player-progress="progressTime" ng-duration="player.length" ng-on-seek="onUserSeek" ng-on-change="onUserSeekChanged" ng-show="player.isComponentVisible('seek') && (seeking || !buffering) && player.length > 0"><div id="controlbar-top" ng-show="seeking || !buffering"><div ng-click="player.paused = !player.paused" ng-class="{ 'icon-ic_play': player.paused, 'icon-ic_pause': !player.paused }" ng-show="player.isComponentVisible('playpause')" class="icon"></div><div ng-click="playNext()" ng-show="showPlayNextButton" style="padding-top: 4px; margin-left: -9px" class="icon icon-ic_play_next"></div><div ng-show="player.isComponentVisible('playpause')" ng-class="{ movePlayerControlsSeparator: showPlayNextButton }" class="vert-sep-bottom"></div><span id="play-progress-text" ng-show="player.isComponentVisible('seek') && !(!player.length || selected.stream.live)" class="play-progress-text"></span><div id="controlbar-buttons" ng-show="true"><div id="streamingReport" ng-mouseenter="stats=true" ng-mouseleave="stats=false" ng-class="{hover: stats}" title="Streaming Report" class="icon icon-ic_network"></div><div class="vert-sep-bottom"></div><div id="volumeIcon" ng-show="player.isComponentVisible('volume')" class="icon icon-ic_volume0"><div id="volumeSlider" class="popup"><div class="scale-visual"></div><div class="scale"><div class="nipple"></div></div></div></div><div id="playbackSpeedIcon" ng-controller="playbackSpeedCtrl" ng-show="player.isComponentVisible('playbackSpeed') && !(!player.length || selected.stream.live)" class="icon icon-ic_speedometer"><div id="playbackSpeedMenu" class="popup"><div class="popup-bottom-border"></div><div translate="PLAYER_PLAYBACK_SPEED" class="text"></div><ul><li ng-repeat="rate in rates" ng-click="changeSpeed(rate)" ng-class="{ selected: rate === currentRate }">x{{ rate }}</li></ul></div></div><div id="dubIcon" ng-show="player.isComponentVisible('dub') && player.audio.length > 1" class="icon"><div id="dubMenu" class="popup"><div class="popup-bottom-border"></div><ul class="listing"><li ng-repeat="audio in player.audio" ng-click="changeAudioTrack(audio)" ng-class="{ selected: player.audioTrack == audio.id }">{{languageNames[audio.lang] || audio.lang || "Track #" + audio.id}}</li></ul></div></div><div id="subIcon" ng-show="player.isComponentVisible('subtitles') && ((selected.subtitles && selected.subtitles.all.length) || (!!player.subtitles && !!player.subtitles.length))" class="icon icon-ic_sub"><div id="subtitleMenu" class="popup"><div class="popup-bottom-border"></div><div class="popup-bottom-border-right"></div><div class="languages"><div class="switch"><label><input type="checkbox" ng-checked="!subtitles.lang && !subtitles.embeddedId" ng-click="switchSubs()"><div class="slider"></div><span translate="ON" class="on"></span><span translate="OFF" class="off"></span></label></div><ul class="listing language"><li ng-if="!!getEmbeddedSubs(player).length" translate="EMBEDDED" class="separator top"></li><li ng-repeat="lang in getEmbeddedSubs(player) track by $id(lang.id)" ng-click="changeSubtitles(lang, true)" ng-class="{ selected: subtitles.embeddedId == lang.id }">{{ languageNames[lang.lang] || lang.lang }}</li><li ng-if="!!player.subtitles && !!player.subtitles.length" class="separator bot"></li><li ng-repeat="lang in selected.subtitles.sortedLangs() track by $id(lang.lang)" ng-click="changeSubtitles(lang)" ng-class="{ selected: subtitles.lang == lang.lang }">{{ lang.name || lang.lang }}</li></ul></div><div ng-if="!!subtitles.lang && !subtitles.ready" class="options"><div class="headline flashing"><span translate="SUBTITLES_LOADING"></span></div></div><div ng-if="(!!subtitles.lang || !!subtitles.embeddedId) && subtitles.ready" class="options"><div class="headline"><span translate="SUBTITLES_CHANGE"></span><span>{{subtitles.langName}}</span></div><div><ul class="select-squares"><li ng-repeat="sub in subtitles.variants track by $id(sub.id)" ng-class="{selected: $index==subtitles.activeIdx}" ng-click="nextSubtitles($index)" title="{{'Sub ID '+sub.id}}">{{$index+1}}</li></ul></div><div ng-if="!subtitles.embeddedId" class="box"><button ng-click="incDelay(-250)"><div class="button icon icon-ic_minus"></div></button><div class="value">{{(subtitles.delay/1000).toFixed(2)}} s</div><button ng-click="incDelay(250)"><div class="button icon icon-ic_plus"></div></button><div class="clear"></div></div><div ng-if="!subtitles.embeddedId" class="hint"><span translate="ADJUST_TIMING"></span><span class="btn">G</span><span> /</span><span class="btn">H</span></div><div class="box"><button ng-click="subSizeDown()" ng-class="{inactive: subtitleSize==0}"><div class="button icon icon-ic_minus"></div></button><div class="value">{{SUBTITLE_DISPLAY_SIZES[subtitleSize]}} %</div><button ng-click="subSizeUp()" ng-class="{inactive: subtitleSize == SUBTITLE_SIZES.length-1}"><div class="button icon icon-ic_plus"></div></button><div class="clear"></div></div><div class="hint"><span translate="ADJUST_SIZE"></span><span class="btn">+</span><span> /</span><span class="btn">-</span></div></div></div></div><div id="castingIcon" ng-show="player.isComponentVisible('casting')" class="icon icon-ic_cast"><div id="castingMenu" class="popup"><div class="popup-bottom-border"></div><div translate="CHOOSE_DEVICE" class="text"></div><div translate="NO_CAST_DEVICES" ng-if="devs.length === 0" class="text"></div><div class="device-container"><div ng-repeat="device in devs" ng-click="!device.placeholder && open({ libItem: selected.item, device: device, stream: selected.stream, intent: 'player' })" title="{{device.label || (device.name ? 'Watch on '+device.name : '') }}" class="device"><i ng-class="['icon-ic_'+device.icon, {inactive: device.placeholder}]" class="icon"></i><div ng-bind="device.label || device.name" class="text"></div></div></div></div></div><div id="settingsIcon" class="icon icon-ic_settings"><div id="settingsMenu" class="popup"><div translate="NO_SETTINGS" ng-if="settingsList.length === 0" class="text"></div><div class="player-settings-container"><div class="popup-bottom-border"></div><div ng-repeat="setting in settingsList" ng-click="setting.click()" title="{{setting.label}}" class="player-setting"><div ng-bind="setting.label" class="text"></div></div></div></div></div></div></div></div><div id="sidebar-handle" ng-show="doesSidebarHaveData()" class="hidable hidden"><div class="button nipple icon-ic_arrow_thin_left"></div></div><div ng-controller="sidebarCtrl" ng-show="doesSidebarHaveData()" ng-if="info" class="sidebar"><div ng-show="showHead && (selected.item && info.videos < 2 || info.hasSeasons(info))" class="head"><div stremio-image="{ url: info.getLogo() }" class="logo"><div class="fallback">{{info.name}}</div></div><div class="year-rating-container"><div ng-show="info.year" class="year"><div translate="YEAR" class="title"></div><span>{{info.year}}</span></div><div ng-show="info.imdbRating" class="rating"><div translate="IMDB_RATING" class="title"></div><span>{{info.imdbRating.toFixed(1)}}</span></div></div></div><div ng-if="showStreamPicker()" spatial-nav-section="{ id: 'streamPicker', restrict: 'self-only', defaultElement: '.button.show-streams', enterTo: 'default-element'}" spatial-nav-section-active="showStreamPicker()" class="stream-picker"><section><span translate="SEASON" class="title"></span><number-picker min="0" ng-model="seasonPicker"></number-picker></section><section><span translate="EPISODE" class="title"></span><number-picker min="1" ng-model="episodePicker"></number-picker></section><section><div tabindex="-1" ng-click="showPickedStreams(seasonPicker, episodePicker)" class="button show-streams">{{ 'SIDEBAR_SHOW_STREAMS' | translate }}</div></section></div><div ng-if="showHead && displayType === 'movie'" class="movie-details"><div ng-show="info.genres.length" class="genre"><span translate="GENRE" class="title"> </span><div>{{info.genres.join(", ")}}</div></div><div ng-show="info.director.length" class="director"><span translate="DIRECTOR" class="title"></span><div>{{info.filterCrewNames(info.director, 3).join(", ")}}</div></div><div ng-show="info.writer.length" class="writer"><span translate="WRITER" class="title"></span><div>{{info.filterCrewNames(info.writer, 3).join(", ")}}</div></div><div ng-show="!!info.credits_cast" class="cast"><span translate="CAST" class="title"></span><ul class="scroll-pane"><li ng-repeat="c in info.filterDetailedCrew(info.credits_cast) track by c.id"><div class="name">{{::c.name}}</div><div class="character">as {{::c.character || c.jobs.join(" | ")}}</div></li></ul></div><div ng-show="info.description" class="description"><span translate="DESCRIPTION" class="title"></span><div>{{info.description}}</div></div></div><ul ng-if="displayType === 'tv'" class="tvguide"><li ng-repeat="item in info.currentTvGuide().slice(0,5)"><span>{{::selected.item.starts | date:"HH:mm"}}</span><h4>{{::selected.item.name}}</h4></li></ul><div ng-if="displayType === 'series'" class="episodes"><div ng-show="showReceiveNotifCheckbox()" ng-click="item.state.noNotif = !item.state.noNotif; item.save(); $event.stopPropagation();" class="showNotifs"><input type="checkbox" ng-checked="!item.state.noNotif"><span>{{item.type === 'series' ? 'DETAIL_RECEIVE_NOTIF_SERIES' : 'DETAIL_RECEIVE_NOTIF_VIDEOS' | translate}}</span></div><div ng-class="{ small: info.getSeasons().length < 20 }" class="season-chooser"><span translate="SEASONS" class="title"></span><ul><li ng-repeat="seasonNumber in info.getSeasons()" ng-click="sidebarSel.season = seasonNumber" ng-class="{selected: sidebarSel.season == seasonNumber}" ng-right-click="contextMenuSeason(item, info, seasonNumber, $event)" tabindex="-1">{{::seasonNumber}}</li><li ng-if="info.specialEpisodes.length" ng-click="sidebarSel.season = 0" ng-class="{selected: sidebarSel.season == 0}">{{::translate('special')}}</li></ul></div><ul class="episodes-list scroll-pane fullHeight"><li ng-repeat="episode in episodesBySeason(info, sidebarSel.season) | orderBy:"number" track by episode._id" ng-click="open({ libItem: item, metaItem: info, video: episode, intent: 'player' })" ng-class="getVidClasses(item, episode)" ng-right-click="!isUpcoming(episode) && contextMenuVideo(item, info, episode, $event)" title="{{episode.title ? episode.title+': ' : ''}}{{episode.season ? 'Season ' + episode.season : 'special' }}, Episode {{episode.episode}}" tabindex="-1"><span class="ep-numb">{{::episode.episode}}</span><span class="ep-name">{{::episode.title || "TBA"}}</span><span title="Available offline" class="offline-indicator"></span><span ng-show="isUpcoming(episode)" timestamp-to-date="episode.released.getTime()" class="date"></span><span ng-show="hasMissingDate(episode) && !hasStreams(episode)" class="icon icon-ic_ghost"></span></li></ul></div><div ng-class="{ noThumb: info.videos[0] && !info.videos[0].thumbnail }" ng-if="displayType === 'channel'" class="uploads"><div ng-show="showReceiveNotifCheckbox()" ng-click="item.state.noNotif = !item.state.noNotif; item.save(); $event.stopPropagation();" class="showNotifs"><input type="checkbox" ng-checked="!item.state.noNotif"><span>{{item.type === 'series' ? 'DETAIL_RECEIVE_NOTIF_SERIES' : 'DETAIL_RECEIVE_NOTIF_VIDEOS' | translate}}</span></div><div><input ng-model="info.search" placeholder="{{ 'SEARCH_VIDEOS' | translate }}" ng-focus="onInputFocus()" ng-blur="onInputBlur()" class="search"><div class="icon icon-ic_search icon-search"></div></div><ul scroll-pane-to="li.playing" class="episodes-list scroll-pane fullHeight"><li ng-repeat="video in info.videos | filter:info.search | orderBy:reverse:'released' track by video._id" ng-class="getVidClasses(item, video)" ng-click="open({ libItem: item, metaItem: info, video: video, intent: 'player' })" ng-right-click="contextMenuVideo(item, info, video, $event)" title="{{::video.title}}" tabindex="-1"><div class="item"><img stremio-image="::{ url: video.thumbnail }" class="vid-thumb"><span class="vid-name">{{::video.title}}</span><span ng-if="::video.released.getTime()" class="vid-date">{{::video.released | date:"d MMM yyyy"}}</span></div></li></ul></div></div><div class="subtitles-container hidable {{SUBTITLE_SIZES[subtitleSize]}}"><span id="subtitle" ng-show="selected.item && selected.loaded && !buffering"></span></div><div ng-show="showNextVideo && !isDismissed" class="binge-group"><div class="title">{{ 'PLAYER_NEXT_VIDEO_TITLE' | translate }} {{ '' }}<span class="accent">{{ selected.item.name }}</span></div><div class="metadata"><div style="background-image: url({{ selected.item.poster }})" ng-show="nextVideo.description" class="poster"></div><div class="info"><div class="name">{{ nextVideo.name }} ({{ nextVideo.season }}x{{ nextVideo.episode }})</div><div class="description">{{ nextVideo.description }} </div></div></div><div class="buttons"><button ng-click="isDismissed = true" class="button clear"><div class="icon icon-ic_x"></div><div class="label">{{ 'PLAYER_NEXT_VIDEO_BUTTON_DISMISS' | translate }}</div></button><button ng-click="watchNext()" autofocus="showNextVideo" class="button"><div class="icon icon-ic_play"></div><div class="label">{{ 'PLAYER_NEXT_VIDEO_BUTTON_WATCH' | translate }}</div></button></div></div><video id="videoPlayer" videoPlayer="html5"></video></div>
</script>
<script type="text/ng-template" id="addonsTpl">
<div id="addonsCatalog" ng-controller="addonCatalogueCtrl" ng-cloak><div id="addons" spatial-nav-section="{ id: 'addons', enterTo: 'last-focused'}" spatial-nav-section-active="$state.includes('addons') && ! prompt"><div class="addons-handle"><div ng-click="$root.goBack()" class="tab"><div class="icon icon-ic_back_ios"></div><span translate="BACK"></span></div></div><div class="filter"><form ng-submit="" tabindex="-1" class="addon-search"><div class="icon icon-ic_search"></div><div class="addon-search-input"><input type="text" placeholder="{{translate('ADDON_SEARCH')}}" ng-model="searchOrUrl" ng-paste="pasteRepoOrAddon($event.originalEvent)" ng-change="searchAddons()"></div><input type="submit" ng-click="addAddonOrCollection(searchOrUrl)" value="{{::translate('ADDON_ADD')}}" class="submit"></form><ul class="type"><li ng-repeat="cat in addonCategories" ui-sref="addons({ cat: cat, collection: null, type: 'all' })" ui-sref-opts="{location: 'replace'}" ng-class="{ selected: cat == getSelectedCat() }" tabindex="-1"><span ng-if="cat == 'my'" translate="ADDON_MY" class="label"> </span><span ng-if="cat == 'official'" translate="ADDON_OFFICIAL" class="label"></span><span ng-if="cat == 'community'" translate="ADDON_COMMUNITY" class="label"></span></li></ul><ul class="type"><li ui-sref="addons({type: 'all'})" ui-sref-active="selected" ui-sref-opts="{location: 'replace'}" tabindex="-1" translate="ALL_CATEGORIES"></li><li ng-repeat="type in getTypes()" ui-sref="addons({type: type})" ui-sref-active="selected" ui-sref-opts="{location: 'replace', reload: true}" tabindex="-1" ng-bind="::plural(type)"></li></ul></div><div class="holder"><div class="addon-row"><div><span ng-if="getSelectedCat() == 'my'" translate="ADDON_MY" class="label"></span><span ng-if="getSelectedCat() == 'official'" translate="ADDON_OFFICIAL" class="label"></span><span ng-if="getSelectedCat() == 'community'" translate="ADDON_COMMUNITY" class="label"></span><span ng-if="getSelectedCat() == 'custom'" class="label">{{getColUrl()}}</span></div><div class="addon-row-holder"><div ng-repeat="addon in getAddons() track by addon.transportUrl" ng-class="{ installed: isInstalled(addon) }" tabindex="0" spatial-nav-enter="toggleWithPrompt(addon)" class="pure-u-1-4 addon"><div class="addon-content"><div class="left-pane"><div class="desc-row"><div class="addon-logo"><img ng-src="{{::logoURL(addon)}}" alt="{{::addon.manifest.name}} logo"></div><div><h2 ng-bind="::addon.manifest.name" class="title"></h2><span ng-bind="addon.manifest.version ? 'v'+addon.manifest.version : ''" class="version"></span><h3 ng-if="isInstalled(addon)" class="title"><div class="icon icon-ic_check"></div><span translate="ADDON_INSTALLED"></span></h3></div><div ng-bind="::humanTypes(addon.manifest.types)" class="addon-type"></div><div class="description"><div ng-bind="::hostname(addon)"></div><span ng-bind="::addon.manifest.description"></span></div></div></div><div class="right-pane"><div ng-show="!isInstalled(addon)" class="buttons"><a ng-click="configure(addon)" ng-title="translate('ADDON_CONFIGURE')" ng-show="isConfigurable(addon)" ng-class="{'icon-ic_settings': !isConfigRequired(addon)}" class="install"><span translate="ADDON_CONFIGURE" ng-show="isConfigRequired(addon)"></span></a><a ng-click="toggleWithPrompt(addon)" translate="ADDON_INSTALL" ng-hide="isConfigRequired(addon)" class="install"></a></div><div ng-show="isInstalled(addon)" class="buttons"><a ng-click="configure(addon)" ng-title="translate('ADDON_CONFIGURE')" ng-show="isConfigurable(addon) && !isConfigRequired(addon)" class="install icon-ic_settings"></a><a ng-click="toggleInstalled(addon)" translate="ADDON_UNINSTALL" class="remove"></a></div><div class="share"><h3 translate="SHARE_ADDON"></h3><div class="btns"><div ng-click="shareAddon(addon, 'facebook')" class="btn"><div class="icon icon-ic_facebook"></div></div><div ng-click="shareAddon(addon, 'twitter')" class="btn"><div class="icon icon-ic_twitter"></div></div><div ng-click="shareAddon(addon, 'copylink')" class="btn"><div class="icon icon-ic_link"></div></div></div></div></div></div></div></div></div></div></div><div id="addonPromptModal" ng-class="{ visible: prompt }" ng-click="closePrompt()" spatial-nav-section="{ id: 'addonPromptModal', restrict: 'self-only', defaultElement: '#addonPromptModal .button:first', enterTo: 'default-element'}" spatial-nav-section-active="$state.includes('addons') && prompt" class="modalWrap modalUnclosable"><div ng-click="$event.stopPropagation()" class="modal"><div style="background-image: url('{{prompt.addon.manifest.background}}')" class="modal-bg"><div ng-click="closePrompt()" class="close icon icon-ic_x closeModal"></div><h3><span>{{isInstalled(prompt.addon) ? 'ADDON_UNINSTALL' : 'ADDON_INSTALL' | translate}}</span>
<span ng-if='isUpgradable(prompt.addon)'>/ <span translate="ADDON_UPGRADE"></span></span>
<span translate="ADDON_ADDON"></span></h3><h2 class="title"><img ng-if="prompt.addon && logoURL(prompt.addon, true)" ng-src="{{logoURL(prompt.addon)}}" alt=" ">{{prompt.addon.manifest.name}} <small>v{{prompt.addon.manifest.version}}</small></h2><p>{{prompt.addon.manifest.description}}</p><div class="modal-contents"></div><p class="nowrap"> <b>URL:</b> {{prompt.addon.transportUrl}}</p><p class="nowrap"><b>{{'ADDON_SUPPORTED_TYPES' | translate}}:</b><span ng-repeat="type in prompt.addon.manifest.types"> <span ng-bind="$parent.plural(type)" class="ucfirst"></span><span ng-bind="', '" ng-hide="$last"></span></span></p><p ng-show="getCatalogs(prompt.addon).length" class="nowrap"><b>{{'ADDON_SUPPORTED_CATALOGS' | translate}}:</b><span ng-repeat="catalog in getCatalogs(prompt.addon)"> <span ng-bind="catalog" class="ucfirst"></span><span ng-bind="', '" ng-hide="$last"></span></span></p><br><div ng-show="getDuplicates(prompt.addon).length > 0"><b translate="ADDON_DUPLICATE_WARNING"></b><ul><li ng-repeat="addon in getDuplicates(prompt.addon) track by addon.transportUrl" class="nowrap">{{::addon.manifest.name}} (<a ng-click="openExternal(addon.transportUrl)" target="_blank" rel="noopener noreferrer">{{::addon.transportUrl}})</a></li></ul><br></div><i ng-show="!isOfficial(prompt.addon)" translate="ADDON_DISCLAIMER"></i><div class="buttons"><div ng-click="closePrompt()" tabindex="-1" class="button-s button"><span translate="BUTTON_CANCEL"></span></div><div ng-click="configure(prompt.addon); closePrompt()" tabindex="-1" ng-show="isConfigurable(prompt.addon) && ! isInstalled(prompt.addon)" class="button-s button install-button configure"><span translate="ADDON_CONFIGURE"></span></div><div ng-click="toggleInstalled(prompt.addon); closePrompt()" tabindex="-1" ng-hide="isConfigRequired(prompt.addon) && ! isInstalled(prompt.addon)" class="button-s button install-button"><span translate="ADDON_INSTALL" ng-hide="isInstalled(prompt.addon)"></span><span translate="ADDON_UNINSTALL" ng-show="isInstalled(prompt.addon)"></span></div><div ng-click="upgrade(prompt.addon); closePrompt()" tabindex="-1" ng-show="isUpgradable(prompt.addon)" class="button-s button install-button"><span translate="ADDON_UPGRADE"></span></div></div></div></div></div></div>
</script>
<script type="text/ng-template" id="settingsTpl">
<div id="settingsPage" ng-controller="settingsPageCtrl" ng-cloak spatial-nav-section="{ id: 'settings' }" spatial-nav-section-active="$state.includes('settings')" class="settings-container"><div class="sections"><nav scrollspy-menu="{container: "#settingsPanel", offset: 150}"><a href="#settings-user-prefs" tabindex="-1" translate="SETTINGS_NAV_GENERAL" class="active"></a><a href="#settings-player-prefs" tabindex="-1" translate="SETTINGS_NAV_PLAYER"></a><a href="#settings-streaming-prefs" tabindex="-1" translate="SETTINGS_NAV_STREAMING"></a><a href="#settings-shortcuts" tabindex="-1" translate="SETTINGS_NAV_SHORTCUTS"></a></nav><div ng-click="openExternal('https://'+$root.WEB_DOMAIN)" class="bottom"><hr><div>{{WEB_DOMAIN}}</div><div ng-if="ipc.isDesktop">{{PRODUCT_NAME}} {{ipc.props.shellVersion}} ©</div><div>Web UI {{PRODUCT_VERSION}}</div><div ng-if="settings.serverVersion">Server {{settings.serverVersion}}</div></div></div><div id="settingsPanel" class="settings-panel"><section id="settings-user-prefs"><h2 translate="SETTINGS_NAV_GENERAL"></h2><div class="category"><div class="account"><div class="profile-picture"><img ng-src="{{settings.avatarUrl() || 'assets/images/anonymous.svg'}}" class="picture"></div><span class="email">{{API.user ? API.user.email : translate('ANONYMOUS_USER')}}</span></div><div class="section"><div ng-click="logout()" tabindex="-1" class="button button-s">{{API.user ? translate("LOG_OUT") : translate("SIGN_UP")+" / "+translate("LOG_IN")}}</div><div ng-if="isAppQuitable" ng-click="ipc.send('quit')" tabindex="-1" class="button button-s">{{translate("QUIT")}}</div></div><a tabindex="-1" ng-click="ifRegistered(settings.fbImport)" translate="SETTINGS_IMPORT_FB"></a><a tabindex="-1" ng-click="ifRegistered(exportData)" translate="SETTINGS_DATA_EXPORT"></a><a tabindex="-1" ng-click="ifRegistered(subscribeCalendar)" translate="SETTINGS_SUBSCRIBE_CALENDAR"></a><a tabindex="-1" ng-click="openExternal('https://stremio.zendesk.com/')" translate="SETTINGS_SUPPORT"></a><a tabindex="-1" ng-click="openExternal('https://stremio.zendesk.com/hc/en-us/articles/360021428911-How-to-delete-my-account')" translate="SETTINGS_ACC_DELETE"></a><a tabindex="-1" ng-if="API.user" ng-href="{{ '//'+$root.WEB_SERVICE_DOMAIN+'/reset-password/'+API.user.email }}" target="_blank" translate="SETTINGS_CHANGE_PASSWORD"></a><br><div class="trakt"><div class="icon icon-ic_trakt"></div><label class="label">{{API.user.trakt.name || translate("SETTINGS_TRAKT")}}</label><div ng-hide="isTraktActive()" ng-click="ifRegistered(settings.traktConnect)" translate="AUTHENTICATE" tabindex="-1" class="button button-s"></div><div ng-show="isTraktActive()" ng-click="traktDisconnect()" translate="SETTINGS_TRAKT_LOGOUT" tabindex="-1" class="button button-s"></div></div><br><div ng-click="openAddonsPage('settings')" tabindex="-1" class="button button-s"><span style="width: 20px; height: 20px; font-size: 20px; line-height: 20px" class="icon icon-ic_addons"></span><span translate="ADDONS"></span></div></div><div class="category"><div class="setting"><label translate="SETTINGS_UI_LANGUAGE"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="Language" ng-model="currentLang" ng-change="changeLang(currentLang)" ng-options="langName(lang) for lang in settings.allLanguages"></select></div></div><div class="setting"><div label="'SETTINGS_FULLSCREEN_EXIT' | translate" state="$root.kbdEscExitFullScreen" class="stremio-checkbox"></div></div><div class="setting"><div label="'SETTINGS_GAMEPAD' | translate" state="$root.gamepadEnabled" class="stremio-checkbox"></div></div><div class="setting"><div ng-if="isAppQuitable" label="'SETTINGS_CLOSE_WINDOW' | translate" state="$root.closeByDefault" class="stremio-checkbox"></div></div></div><div class="category"><div class="setting"><div ng-click="$root.showLocalStorageModal = true" tabindex="-1" class="button button-s">{{ 'SETTINGS_STORAGE_BUTTON' | translate }}</div></div></div></section><hr><section id="settings-player-prefs"><h2 translate="SETTINGS_NAV_PLAYER"></h2><div class="category"><div class="title"> <div class="icon icon-ic_sub"></div>Subtitles</div><div class="setting"><label translate="SETTINGS_SUBTITLES_LANGUAGE"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="subsLanguage" ng-model="$root.subsLang" ng-options="key as value for (key, value) in subtitleLanguages"></select></div></div><div class="setting"><label translate="SETTINGS_SUBTITLES_SIZE"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="subtitleSize" ng-model="$root.subtitleSize" ng-options="key as value for (key, value) in SUBTITLE_DISPLAY_SIZES"></select></div></div><div class="setting"><label translate="SETTINGS_SUBTITLES_BACKGROUND"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="subsBgStyle" ng-model="$root.subsBgStyle" ng-options="key as value for (key, value) in SUBTITLE_DISPLAY_BACKGROUNDS"></select></div></div><div class="setting"><label translate="SETTINGS_SUBTITLES_COLOR"></label><div class="custom-color"><input type="color" name="subsColor" ng-model="$root.subsColor" tabindex="-1"></div></div><div class="setting"><label translate="{{subsBgStyle == '0' ? 'SETTINGS_SUBTITLES_COLOR_OUTLINE' : 'SETTINGS_SUBTITLES_COLOR_BACKGROUND'}}"></label><div class="custom-color"><input type="color" name="subsOutlineColor" ng-model="$root.subsOutlineColor" tabindex="-1"></div></div></div><div class="category"><div class="title"> <div class="icon icon-ic_volume2"></div>Audio</div><div class="setting"><div label="'SETTINGS_ENABLE_DEFAULT_AUDIO_TRACK'" state="$root.enableDefaultAudioTrack" class="stremio-checkbox"></div></div><div ng-show="$root.enableDefaultAudioTrack" class="setting"><label translate="SETTINGS_DEFAULT_AUDIO_TRACK"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="defaultAudioTrack" ng-model="$root.defaultAudioTrack"><option ng-repeat="(key, value) in subtitleLanguages" value="{{key}}">{{ value }} ({{ key }})</option></select></div></div></div><div class="category"><div class="title"> <div class="icon icon-ic_remote"></div>Controls</div><div class="setting"><label translate="SETTINGS_SEEK_KEY"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="seekStep" ng-model="$root.seekStep" ng-options="key as value for (key, value) in PLAYER_SEEK_STEPS"></select></div></div><div class="setting"><label translate="SETTINGS_SEEK_KEY_SHIFT"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="shiftSeekStep" ng-model="$root.shiftSeekStep" ng-options="key as value for (key, value) in PLAYER_SEEK_STEPS"></select></div></div><div class="setting"><div label="'SETTINGS_PAUSE_MINIMIZED'" state="$root.pauseOnMinimize" class="stremio-checkbox"></div></div></div><div class="category"><div class="title"><div class="icon icon-ic_play"></div>Auto-Play</div><div class="setting"><div label="'SETTINGS_BINGE'" state="$root.bingeWatch" class="stremio-checkbox"></div></div><div class="setting"><div label="'SETTINGS_NEXT_VIDEO'" state="$root.enableNextVideo" ng-show="$root.bingeWatch" class="stremio-checkbox"></div></div><div ng-show="$root.bingeWatch && $root.enableNextVideo" class="setting"><label translate="SETTINGS_NEXT_VIDEO_TRIGGER"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select name="nextVideoTrigger" ng-model="$root.nextVideoTrigger" ng-options="key as value for (key, value) in NEXT_VIDEO_TRIGGER"></select></div></div></div><div class="category"><div class="title"> <div class="icon icon-ic_glasses"></div>Advanced</div><div class="setting"><div label="'SETTINGS_HWDEC'" state="$root.hwDec" class="stremio-checkbox"></div></div><div class="setting"><div label="'SETTINGS_MPV_WINDOW'" state="$root.mpvSeparateWindow" class="stremio-checkbox"></div></div></div></section><hr><section id="settings-streaming-prefs"><h2 translate="SETTINGS_NAV_STREAMING"></h2><div class="category"><div ng-repeat="option in $root.cacheOptions" title="{{:: translate(option.label) }}" ng-class="{ 'option-toggle': option.type === 'checkbox', 'option-image': option.type === 'image' }" ng-click="option.type === 'checkbox' && (values[option.id] = !values[option.id])" class="option {{::option.class }}"><div class="setting"><label for="cacheOption{{::option.id}}" translate="{{::option.label}}"></label><div tabindex="-1" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select id="cacheOption{{option.id}}" ng-if="::option.type=='select' || option.type=='slider'" ng-model="values[option.id]" ng-options="sel.val as sel.name for sel in option.selections"></select></div></div></div><div ng-repeat="option in $root.checkboxOptions" title="{{:: translate(option.title) }}" ng-click="(values[option.id] = !values[option.id])" class="option option-toggle {{::option.class }}"><div ng-if="::option.icon" class="icon icon icon-settings-{{::option.class }}"></div><div class="setting"><label translate="{{::option.label || option.id}}"></label><input type="checkbox" ng-checked="values[option.id]" ng-disabled="::option.disabled" tabindex="-1"></div></div><div ng-repeat="option in $root.otherOptions" title="{{:: translate(option.title) }}" ng-class="{ 'option-image': option.type === 'image' }" class="option {{::option.class }}"><div class="setting"><label for="cacheOption{{::option.id}}" translate="{{::option.label}}"></label><img ng-if="option.type === 'image'" ng-src="{{::option.src}}"><div tabindex="-1" ng-if="::option.type=='select' || option.type=='slider'" class="custom-select"><div class="icon icon-ic_arrow_down"></div><select id="cacheOption{{option.id}}" ng-if="::option.type=='select' || option.type=='slider'" ng-model="values[option.id]" ng-options="sel.val as sel.name disable when sel.disabled for sel in option.selections"></select></div></div></div><div class="option custom-space"><div class="setting"><label translate="SETTINGS_SERVER_URL"></label><div class="ro-copy-text-container"><input type="text" readonly value="{{$root.streamingServerUrl}}" onfocus="select()"><button tabindex="-1" translate="COPY" ng-click="copyToClipboard($root.streamingServerUrl)" class="button-b"></button></div></div></div><div class="option custom-space"><span ng-class="{'icon-ic_check': !enginefsNotFound, 'icon-ic_x': !!enginefsNotFound}" class="icon"></span> <span translate="SETTINGS_SERVER_AVAILABLE" ng-if="!enginefsNotFound"></span><span translate="SETTINGS_SERVER_UNAVAILABLE" ng-if="!!enginefsNotFound"></span></div><div ng-if="httpsEndpoint" class="option custom-space"><div class="setting"><label translate="SETTINGS_HTTPS_ENDPOINT"></label><div class="ro-copy-text-container"><input type="text" readonly value="{{httpsEndpoint}}" onfocus="select()"><button tabindex="-1" translate="COPY" ng-click="copyToClipboard(httpsEndpoint)" class="button-b"></button></div></div></div></div><div class="category"><div class="setting"><div label="'SETTINGS_OVERRIDE_SERVER'" state="$root.streamingServerOverride" disabled="serverOverride" class="stremio-checkbox"></div></div><div tabindex="-1" ng-show="streamingServerOverride" class="option custom-space"><input name="streamingServerUrl" type="url" ng-model="$root.streamingServerUrl" ng-disabled="serverOverride"></div></div></section><hr><section id="settings-shortcuts" class="last"><h2 translate="SETTINGS_NAV_SHORTCUTS"></h2><div class="category"><div ng-repeat="shortcut in shortcuts" class="setting"><label translate="{{ shortcut.label }}"></label><div class="shortcut-keys"><span ng-repeat="key in shortcut.combo.modifiers track by $index"><span ng-if="key !== null"><kbd>{{ key }}</kbd><span>+</span></span></span><span ng-repeat="key in shortcut.combo.keys track by $index"><kbd>{{ key }}</kbd><span ng-show="!shortcut.combo.modifiers.length && $index < shortcut.combo.keys.length - 1">or</span></span><span ng-if="shortcut.hasOptionalModifiers"><span>and</span><span ng-repeat="key in shortcut.combo.keys track by $index"><kbd>{{ key }}</kbd><span ng-show="!shortcut.combo.modifiers.length && $index < shortcut.combo.keys.length - 1">or</span></span></span></div></div></div></section></div></div><modal callback="$root.localStorageModalCallback" ng-show="$root.showLocalStorageModal"><title>{{ 'SETTINGS_STORAGE_MODAL_TITLE' | translate }}</title><message>{{ 'SETTINGS_STORAGE_MODAL_MESSAGE' | translate }}</message></modal>
</script>
<script type="text/ng-template" id="introTpl">
<div id="introModal" ng-controller="introCtrl" class="modalWrap modalFull visible modalUnclosable"><div id="intro" ng-class="{ login: selected.mode=='login', register: selected.mode=='register' }"><div ng-if="fbLoading" class="loader overlay"><div class="loader2 loader2-center"><div class="loader-frame-1"></div><div class="loader-frame-2"></div><div class="loader-frame-3"></div><div class="loader-frame-4"></div></div><div class="loader-actions"><div translate="WAITING_FB_LOGIN" class="label"></div><div translate="BUTTON_CANCEL" ng-click="abortFBLogin()" class="button"></div></div></div><form ng-if="!fbLoading" class="login-form"><div class="login-data"><div ng-show="!fbUser" class="login-user"><div ng-click="loginWithFB()" class="button fb"><div class="icon icon-ic_facebook"></div><div translate="FB_LOGIN" class="fb-text"></div></div><div translate="FB_NOPOST" class="fb-subtext"></div><div translate="OR" class="or"></div><input type="text" placeholder="{{"email" | translate}}" ng-model="user.email" ng-model-options="{ updateOn: "default blur", debounce: { default: 80, blur: 0 } }" class="email"><input type="password" placeholder="{{"password" | translate}}" ng-model="user.password" ng-model-options="{ updateOn: "default blur", debounce: { default: 80, blur: 0 } }" class="password"><input ng-show="selected.mode == 'register'" type="password" placeholder="{{"confirm password" | translate}}" ng-model="user.passwordConfirm" ng-model-options="{ updateOn: "default blur", debounce: { default: 80, blur: 0 } }" class="conf-password"><label ng-show="selected.mode === 'register'" class="accept"><input type="checkbox" ng-model="consent.tos"><span><span translate="I_ACCEPT" class="acc"></span><span> </span><a ng-click="openExternal('https://'+$root.WEB_DOMAIN+'/tos');$event.stopPropagation()" translate="TOS" class="accept-link"> </a></span></label><label ng-show="selected.mode === 'register'" class="accept"><input type="checkbox" ng-model="consent.privacy"><span><span translate="I_ACCEPT" class="acc"></span><span> </span><a ng-click="openExternal('https://'+$root.WEB_DOMAIN+'/privacy');$event.stopPropagation()" translate="Privacy Policy" class="accept-link"> </a></span></label><label ng-show="selected.mode === 'register'" class="accept"><input type="checkbox" ng-model="consent.marketing"><span><span translate="I accept" class="acc"></span><span> </span><a ng-click="openExternal('https://'+$root.WEB_DOMAIN+'/privacy');$event.stopPropagation()" translate="to receive marketing communications from Stremio" class="accept-link"></a></span></label></div><div ng-show="fbUser" class="login-fbuser"><div ng-style="{ 'background-image': 'url(https://graph.facebook.com/'+fbUser.fbId+'/picture?width=150&height=150)' }" class="avatar"></div><div class="name">{{fbUser.fullname}}</div></div><div class="error-label"><div ng-show="error && !error.wrongPass && !error.fbAcc && !error.existingUser" ng-bind-html="error.message | translate"></div><div ng-show="error && error.fbAcc" class="fb-acc"><span translate="EMAIL_USED_WITH_FB"></span> <a ng-click="loginWithFB()" translate="FB_LOGIN"></a> <span translate="OR"></span> <a ng-click="openExternal('https://'+$root.WEB_SERVICE_DOMAIN+'/reset-password/'+user.email)" translate="SET_A_PASS"></a></div><div ng-show="error && error.wrongPass" class="wrong-pass"><span translate="WRONG_PASSWORD"></span><a ng-click="openExternal('https://'+$root.WEB_SERVICE_DOMAIN+'/reset-password/'+user.email)" translate="CLICK_HERE"></a></div><div ng-show="error && error.existingUser" class="wrong-pass"><span translate='EMAIL_USED'></span> (<a ng-click="selected.mode = 'login'; error = null" translate="LOG_IN"></a>)</div></div><button type="submit" value="{{translate(selected.mode == 'register' ? 'SIGN_UP' : 'LOG_IN')}}" ng-click="loginOrReg()" class="button proceed">{{selected.mode == 'register' ? 'SIGN_UP' : 'LOG_IN' | translate}}</button><div ng-show="fbUser" class="accept-fb"><div translate="I_ACCEPT_BY_CLICKING" class="acc"></div><a ng-click="openExternal('https://'+$root.WEB_DOMAIN+'/tos');$event.stopPropagation()" translate="TOS"></a></div><ul ng-hide="fbUser" class="alt-opts"><li ng-hide="selected.mode == 'register'" ng-click="selected.mode = 'register'" translate="SIGN_UP_EMAIL" class="button"></li><li ng-show="selected.mode == 'register'" ng-click="selected.mode = 'login'" translate="LOG_IN" class="button"></li><li ng-click="guestLogin()" translate="GUEST_LOGIN" ng-show="selected.mode == 'register'" class="button"></li></ul></div></form></div></div>
</script>
<script type="text/ng-template" id="tasteTpl">
<div id="taste" ng-controller="tasteCtrl"><div class="header"><a ng-click="goBack()" class="back"><div class="icon icon-back"></div></a><div class="account"><div ng-hide="API.user.fbId || gravatar" class="icon icon-settings-account"></div><img ng-show="avatarUrl()" ng-src="{{avatarUrl()}}" class="picture"><div class="email blue">{{API.user ? API.user.fullname : ""}}</div></div></div><div class="center"><div translate="INTRO_TASTE_HELP_US" class="subtitle"></div><div translate="INTRO_TASTE_CHOOSE_THESE" class="title"></div></div><div class="grid clearfix"><div ng-repeat="taste in allTastes" ng-click="pickTaste(taste.id)" ng-class="{selected: isSelected(taste.id)}" class="tile"><div ng-style="{ 'background-image': 'url(https://www.stremio.com/images/taste-backgrounds/bg-'+taste.id+'.jpg)' }" class="bg"></div><div class="overlay"></div><div class="text"><span translate="{{taste.name}}"></span></div></div></div><div ng-show="error && taste.length < 3" translate="{{error}}" class="error-label"></div><div ng-class="{disabled: taste.length < 3}" ng-click="continue()" translate="BUTTON_CONTINUE" class="button button-s"></div><div ng-show="taste.length < 3" translate="INTRO_TASTE_CHOOSE_MIN" class="label"></div></div>
</script>
<script type="text/ng-template" id="stremioCheckboxTpl">
<div ng-click="disabled ? false : state = !state" class="option option-toggle"><input type="checkbox" ng-checked="state" ng-disabled="disabled" tabindex="-1"><label>{{label | translate}}</label></div>
</script>
<script type="text/ng-template" id="numberPickerTpl">
<div class="number-picker"><div tabindex="-1" ng-click="decrement()" ng-class="{ 'disabled': ngModel <= min }" class="button"><div class="icon icon-ic_minus"></div></div><input type="number" min="{{min}}" max="{{max}}" ng-model="ngModel"><div tabindex="-1" ng-click="increment()" ng-class="{ 'disabled': ngModel >= max }" class="button"><div class="icon icon-ic_plus"></div></div></div>
</script>
<script type="text/ng-template" id="modalTpl">
<div class="modal-dialog"><div ng-click="closeCallback()" class="modal-backdrop"></div><div class="modal-container"><div ng-click="closeCallback()" class="modal-close icon icon-ic_x closeModal"></div><div class="modal-content"><h3 ng-transclude="title"></h3><div ng-transclude="message" class="modal-message"></div></div><div class="buttons-container"><div tabindex="-1" ng-click="closeCallback(false)" ng-transclude="cancelButton" class="modal-button">{{ 'BUTTON_CANCEL' | translate }}</div><div tabindex="-1" ng-click="closeCallback(true)" ng-transclude="confirmButton" class="modal-button accent">{{ 'BUTTON_CONTINUE' | translate }}</div></div></div></div>
</script>
<link rel="stylesheet" href="assets/css/blob.css?ver=afb25f" />
<script src="assets/js/blob.js?ver=afb25f"></script>
<script type="text/javascript">
if (window.Raven)
Raven.config(
"https://[email protected]/1205585",
{ release: "4.4.159" }
)
.addPlugin(Raven.Plugins.Angular)
.install();
</script>
<style ng-if="isLangRtl(currentLang)">
/* add styles to converting the UI to RTL here */
/*body, html {
direction: rtl;
}*/
</style>
</head>
<body disable-pinch-to-zoom="true" spatial-nav spatial-nav-keyboard-ctrl>
<div
id="window-controls"
ng-cloak
ng-hide="$state.is('taste')"
ng-class="{ player: $state.includes('player'), opened: $root.userMenuOpen }"
class="hidable"
>
<li
ng-click="openAddonsPage('toolbar')"
ng-hide="$state.includes('player')"
title="{{translate('ADDON_CATALOGUE')}}"
class="addons"
>
<div class="icon icon-ic_addons"></div>
</li>
<li ng-click="toggleFullscreen()">
<a
ng-class="{'icon-ic_exit_fullscreen': isFullscreen, 'icon-ic_fullscreen': !isFullscreen}"
class="icon"
></a>
</li>
<li
ng-click="$root.userMenuOpen = !$root.userMenuOpen"
ng-hide="$state.includes('player')"
ng-class="{'selected': userMenuOpen}"
class="user-menu"
>
<div class="icon icon-user icon-ic_more"></div>
</li>
<div id="user-panel" ng-show="$root.userMenuOpen">
<div class="user-info">
<div class="avatar">
<img
ng-src="{{settings.avatarUrl() || 'assets/images/anonymous.svg'}}"
class="picture"
/>
</div>
<div class="email-container">
<div class="email">
{{API.user ? API.user.email : translate('ANONYMOUS_USER')}}
</div>
<a ng-click="logout()" tabindex="-1" class="login-logout-button"
>{{API.user ? translate("LOG_OUT") : translate("SIGN_UP")+" /
"+translate("LOG_IN")}}</a
>
</div>
</div>
<div class="section">
<div
ng-click="toggleFullscreen(); $root.userMenuOpen = false"
class="option"
>
<a
ng-class="{'icon-ic_exit_fullscreen': isFullscreen, 'icon-ic_fullscreen': !isFullscreen}"
class="icon"
></a>
<div
ng-bind="isFullscreen ? 'EXIT_FULLSCREEN' : 'ENTER_FULLSCREEN' | translate"
class="option-label"
></div>
</div>
</div>
<div class="section">
<div
ng-click="$root.userMenuOpen = false"
ui-sref="settings"
class="option"
>
<div class="icon icon-ic_settings"></div>
<div translate="SETTINGS_LABEL" class="option-label"></div>
</div>
<div
ng-click="openAddonsPage('menu'); $root.userMenuOpen = false"
class="option"
>
<div class="icon icon-ic_addons"></div>
<div translate="ADDONS" class="option-label"></div>
</div>
<div
ng-click="openFromClipboard(); $root.userMenuOpen = false"
class="option"
>
<div class="option-icon icon icon-ic_magnet"></div>
<div translate="PLAY_URL_MAGNET_LINK" class="option-label"></div>
</div>
<div
ng-click="ifRegistered(settings.fbImport); $root.userMenuOpen = false"
class="option"
>
<div class="icon icon-ic_facebook"></div>
<div translate="SETTINGS_IMPORT_FB" class="option-label"></div>
</div>
<div
ng-click="addLocalAddon(); $root.userMenuOpen = false"
class="option"
>
<div class="icon icon-ic_folder"></div>
<div
ng-bind-html="'IMPORT_DISK' | translate"
class="option-label"
></div>
</div>
<a
ng-click="$root.userMenuOpen = false"
href="https://stremio.zendesk.com/"
target="_blank"
class="option"
><div class="icon icon-ic_help"></div>
<div translate="HELP_FEEDBACK" class="option-label"></div
></a>
</div>
<div class="section">
<a
ng-click="$root.userMenuOpen = false"
href="https://www.stremio.com/tos"
target="_blank"
class="option"
><div translate="TERMS_OF_SERVICE" class="option-label"></div></a
><a
ng-click="$root.userMenuOpen = false"
href="https://www.stremio.com/"
target="_blank"
class="option"
><div translate="ABOUT_STREMIO" class="option-label"></div></a
><a
ng-click="$root.userMenuOpen = false"
href="https://www.stremio.com/acc-settings"
target="_blank"
class="option"
><div translate="USER_PANEL" class="option-label"></div
></a>
</div>
</div>
</div>
<div
id="header"
ng-hide="$state.is('taste') || $state.includes('player')"
ng-cloak
>
<a ng-show="showBackButton()" ng-click="goBack()" class="tab"
><div class="icon icon-ic_back_ios"></div>
<span translate="BACK"></span></a
><a
ng-repeat="tab in tabs track by tab.name"
ng-class="{selected: $state.current.name.indexOf('{{tab.route}}') > -1}"
ui-sref="{{tab.route}}"
ng-hide="showBackButton()"
tab-name="{{::tab.name}}"
class="tab"
><div ng-hide="tab.notifications" class="icon {{ tab.icon }}"></div>
<div ng-show="tab.notifications" class="notif icon icon-ic_bell"></div>
<span translate="{{tab.name}}"></span
></a>
<div
id="search-form-container"
ng-class="{ searchOpened: $root.searchOpened }"
spatial-nav-section="{ id: 'searchForm', defaultElement: '#search-dropdown .clear-button-container', enterTo: 'default-element', restrict: 'self-only', leaveFor: { up: '#global-search-field' } }"
spatial-nav-section-active="searchNavActive"
>
<form
id="search-bar"
ng-hide="$state.is('detail') || $state.is('player') || $state.is('addons') || $state.is('settings')"
ng-class="{ active: $state.is('search') }"
ng-submit="$state.go('search', { q: searchQuery })"
autocomplete="off"
>
<input
id="global-search-field"
tabindex="-1"
ng-focus="$root.searchOpened = true; searchNavActive = false"
ng-blur="$root.searchOpened = searchNavActive;"
ng-click="$root.searchOpened = true; searchNavActive = false"
placeholder="{{translate('SEARCH_PLACEHOLDER')}}"
type="text"
ng-model="searchQuery"
on-keydown="searchNavActive = true"
on-keydown-key="ArrowDown"
/><button
ui-sref="search({ q: searchQuery })"
ng-click="getLastSearch()"
ng-class="{ active: searchQuery }"
ng-disabled="!searchQuery"
>
<div class="icon icon-ic_search"></div></button
><a
ng-if="searchQuery"
ng-click="resetSearch()"
class="icon icon-ic_x"
></a>
</form>
<div
id="search-dropdown"
ng-show="$root.searchOpened"
ng-mousedown="searchNavActive = true"
>
<div class="last-searches-container">
<div class="header-container">
<div translate="LAST_SEARCHES" class="header"></div>
<div
tabindex="-1"
ng-click="clearSearches()"
ng-keyup="escapeSearch($event)"
class="clear-button-container"
>
<div translate="CLEAR_HISTORY" class="label"></div>
<div class="icon icon-ic_x"></div>
</div>
</div>
<ul class="last-searches">
<li
tabindex="-1"
ui-sref="search({ q: searchQuery })"
ng-repeat="lastSearch in lastSearches"
ng-click="getSelectedSearch(lastSearch)"
ng-keyup="escapeSearch($event)"
title="{{::lastSearch}}"
>
{{::lastSearch}}
</li>
</ul>
</div>
<div class="footer-container">
<div translate="SEARCH_ANYTHING" class="header"></div>
<div class="icons">
<div class="icon-container">
<div class="icon icon-ic_movies"></div>
<div translate="SEARCH_CATEGORIES" class="icon-info"></div>
</div>
<div class="icon-container">
<div class="icon icon-ic_actor"></div>
<div translate="SEARCH_PERSONS" class="icon-info"></div>
</div>
<div class="icon-container">
<div class="icon icon-ic_link"></div>
<div translate="SEARCH_PROTOCOLS" class="icon-info"></div>
</div>
<div class="icon-container">
<div class="icon icon-ic_imdb"></div>
<div translate="SEARCH_TYPES" class="icon-info"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="body" ng-cloak ng-hide="$state.includes('player')">
<div
ui-view="view"
ng-hide="$state.is('detail') || $state.includes('player')"
></div>
<div
id="detailWrapper"
ui-view="detail"
ng-show="$state.is('detail')"
></div>
</div>
<div ui-view="player" ng-show="$state.includes('player')"></div>
<div
ng-show="needRestart && !$state.includes('player')"
ng-cloak
class="bottom-notification ng-hide"
>
<div class="right">
<div class="icon icon-ic_stremio_tray"></div>
<div class="message"><span translate="UPGRADE"></span>.</div>
<div
ng-click="update(needRestart)"
translate="RELAUNCH"
class="call-to-action"
></div>
<div ng-click="needRestart = null" class="close icon icon-ic_x"></div>
</div>
</div>
<div
ng-show="needReload && needReload != PRODUCT_VERSION && ! needRestart && ($state.is('board') || $state.is('discover') || $state.is('library') || $state.is('calendar'))"
ng-cloak
class="bottom-notification ng-hide"
>
<div class="right">
<div class="icon icon-ic_stremio_tray"></div>
<div class="message"><span translate="UPGRADE"></span>.</div>
<div
ng-click="reloadUI(needReload)"
translate="RELOAD_UI"
class="call-to-action"
></div>
<div
ng-click="needReload = PRODUCT_VERSION"
class="close icon icon-ic_x"
></div>
</div>
</div>
<div
id="updateModal"
ng-class="{'visible': !needRestart && needDownload && !$state.includes('player')}"
spatial-nav-section="{ id: 'updateModal', restrict: 'self-only', defaultElement: '#updateModal .button:first', enterTo: 'default-element'}"
spatial-nav-section-active="!needRestart && needDownload && !$state.includes('player')"
class="modalWrap modal-light-center-container"
>
<div ng-click="$event.stopPropagation()" class="modal-light-center">
<img src="assets/images/warning-sign.svg" class="modal-cat" />
<div class="modal-bg">
<div translate="MANUAL_UPDATE_TITLE" class="title"></div>
<p translate="MANUAL_UPDATE_LINE1"></p>
<p translate="MANUAL_UPDATE_LINE2"></p>
<div class="buttons">
<div tabindex="-1" ng-click="needDownload = null" class="button">
<span translate="BUTTON_UPDATE_LATTER"></span>
</div>
<div
tabindex="-1"
ng-click="openExternal('https://www.stremio.com/downloads')"
class="button install-button"
>
<span translate="BUTTON_UPDATE_NOW"></span>
</div>
</div>
</div>
</div>
</div>
<script
type="text/javascript"
async
src="https://www.google-analytics.com/analytics.js"
></script>
</body>
</html>