Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .project
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<projectDescription>
<name>Emby</name>
<name>Jellyfin</name>
<comment>
</comment>
<projects>
Expand Down
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,25 @@
Warning: This app is a legacy program meant for older Samsung Smart TVs running Orsay (pre-2015), which has since been replaced by Tizen. It may be possible to use this app by side-loading, but it is considered unsupported (we are unable to help you with it).

You may also wish to try a web browser with Jellyfin, wherever possible.

This is a fork of the original jellyfin-samsungtv repo which is now archived. If you own an older samsung TV as I do you probably wanted a more updated app. Feel free to use and start issues and pull requests. However, I am not the original developer of this app so I maynot be able to provide the best help.

## Installation

Install the app using your own web server's IP and the appropriate instructions
for your model year TV. Look [here](https://emby.media/community/index.php?/topic/9869-samsung-orsay-smarttv-2011-2015-community-app-install-instructions/&/topic/9869-samsung-smart-tv-app-install-instructions/?p=277346)
for general instructions.

These instructions explain how to prepare the files to be uploaded. It is also
possible to load the files using a USB stick; these notes don't cover that
process.

1. Edit the supplied `package.sh` script to set your own IP address and
document root. The script assumes a modern Linux (Ubuntu) setup; you may
need to make other adjustments to suit your environment.
1. Run the script. It will:

1. Create a ZIP file and an XML file that points to it.
2. Copy the file to your web server's document root.
3. Run the `netcat` command to listen for debug messages emitted when
the application is loaded.
1 change: 0 additions & 1 deletion app/javascript/Gui/GuiDisplay_Episodes.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ GuiDisplay_Episodes.start = function(title,url,selectedItem,topLeftItem) {
this.isLatest = false;
if (title == "New TV") {
this.isLatest = true;
this.ItemData.Items = this.ItemData;
}

if (this.ItemData.Items.length > 0) {
Expand Down
6 changes: 3 additions & 3 deletions app/javascript/Gui/GuiDisplay_Series.js
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ GuiDisplay_Series.processSelectedItem = function() {
var url = Server.getCustomURL("/Users/" + Server.getUserID() + "/Items/Latest?format=json&IncludeItemTypes=Movie"+Server.getMoviesViewQueryPart()+"&IsFolder=false&fields=ParentId,SortName,Overview,Genres,RunTimeTicks");
GuiDisplay_Series.start("Latest Movies",url,0,0);
} else if (this.isTvOrMovies == 0){
var url = Server.getCustomURL("/Users/" + Server.getUserID() + "/Items/Latest?format=json&IncludeItemTypes=Episode&IsFolder=false&fields=ParentId,SortName,Overview,Genres,RunTimeTicks");
var url = Server.getCustomURL("/Users/" + Server.getUserID() + "/Items/Latest?format=json&IncludeItemTypes=Episode&IsPlayed=false&IsFolder=false&fields=ParentId,SortName,Overview,Genres,RunTimeTicks");
GuiDisplay_Series.start("Latest TV",url,0,0);
} else {
var url = Server.getCustomURL("/Users/" + Server.getUserID() + "/Items/Latest?format=json&IncludeItemTypes=Audio&Limit=21&fields=SortName,Genres");
Expand All @@ -585,10 +585,10 @@ GuiDisplay_Series.processSelectedItem = function() {
break;
case "Genre":
if (this.isTvOrMovies == 1) {
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Movie"+Server.getMoviesViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,ItemCounts&userId=" + Server.getUserID());
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Movie"+Server.getMoviesViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName&userId=" + Server.getUserID());
GuiDisplay_Series.start("Genre Movies",url1,0,0);
} else {
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Series"+Server.getTvViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,ItemCounts&userId=" + Server.getUserID());
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Series"+Server.getTvViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName&userId=" + Server.getUserID());
GuiDisplay_Series.start("Genre TV",url1,0,0);
}
break;
Expand Down
19 changes: 13 additions & 6 deletions app/javascript/Gui/GuiMusicPlayer/GuiMusicPlayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ var GuiMusicPlayer = {
updateTimeCount : 0,

videoURL : null,
PlaySessionId : null,

selectedItem : 0,
playedFromPage : null,
Expand Down Expand Up @@ -325,6 +326,12 @@ GuiMusicPlayer.handlePlayKey = function() {
this.currentTime = 0;
this.updateTimeCount = 0;

//Fetch PlaySessionId
var playbackInfo = Server.getPlaybackInfo(this.queuedItems[this.currentPlayingItem].Id);
this.PlaySessionId = playbackInfo ? playbackInfo.PlaySessionId : null;

this.videoURL += '&PlaySessionId=' + this.PlaySessionId;

//Calculate position in seconds
this.pluginMusic.Play(this.videoURL);
}
Expand All @@ -336,7 +343,7 @@ GuiMusicPlayer.handlePlayKey = function() {

GuiMusicPlayer.handlePauseKey = function() {
this.pluginMusic.Pause();
Server.videoPaused(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream");
Server.videoPaused(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream",this.PlaySessionId);
document.getElementById("guiMusicPlayerPlay").style.backgroundImage="url('images/musicplayer/play-29x37.png')";
document.getElementById("guiMusicPlayerPause").style.backgroundImage="url('images/musicplayer/pause-active-32x37.png')";
this.Status = "PAUSED";
Expand All @@ -346,7 +353,7 @@ GuiMusicPlayer.stopPlayback = function() {
//Reset everything
this.Status = "STOPPED";
alert (this.currentPlayingItem);
Server.videoStopped(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream");
Server.videoStopped(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream",this.PlaySessionId);
this.showThemeId = null;
this.isThemeMusicPlaying = false;
this.currentPlayingItem = 0;
Expand Down Expand Up @@ -400,7 +407,7 @@ GuiMusicPlayer.returnToPage = function() {
GuiMusicPlayer.handleNextKey = function() {

//Stop Any Playback
Server.videoStopped(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream");
Server.videoStopped(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream",this.PlaySessionId);
this.pluginMusic.Stop();
this.Status = "STOPPED";

Expand Down Expand Up @@ -429,7 +436,7 @@ GuiMusicPlayer.handlePreviousKey = function() {
//Stop Any Playback
var timeOfStoppedSong = Math.floor((this.currentTime % 60000) / 1000);

Server.videoStopped(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream");
Server.videoStopped(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream",this.PlaySessionId);
this.pluginMusic.Stop();
this.Status = "STOPPED";

Expand Down Expand Up @@ -519,7 +526,7 @@ GuiMusicPlayer.setCurrentTime = function(time){
if (this.updateTimeCount == 8) {
this.updateTimeCount = 0;
//Update Server
Server.videoPaused(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream");
Server.videoPaused(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,this.currentTime,"DirectStream",this.PlaySessionId);
}
document.getElementById("guiMusicPlayerTime").innerHTML = Support.convertTicksToTime(this.currentTime, (this.queuedItems[this.currentPlayingItem].RunTimeTicks / 10000));
}
Expand Down Expand Up @@ -560,7 +567,7 @@ GuiMusicPlayer.OnStreamInfoReady = function() {
document.getElementById("guiMusicPlayerTime").innerHTML = Support.convertTicksToTime(this.currentTime, (this.queuedItems[this.currentPlayingItem].RunTimeTicks / 10000));

//Playback Checkin
Server.videoStarted(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,"DirectStream");
Server.videoStarted(this.queuedItems[this.currentPlayingItem].Id,this.queuedItems[this.currentPlayingItem].MediaSources[0].Id,"DirectStream",this.PlaySessionId);

//Volume & Mute Control - Works!
NNaviPlugin = document.getElementById("pluginObjectNNavi");
Expand Down
8 changes: 4 additions & 4 deletions app/javascript/Gui/GuiPage_MusicAZ.js
Original file line number Diff line number Diff line change
Expand Up @@ -389,10 +389,10 @@ GuiPage_MusicAZ.processTopMenuEnterKey = function() {
break;
case "Genre":
if (GuiDisplay_Series.isTvOrMovies == 1) {
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Movie"+Server.getMoviesViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,ItemCounts&userId=" + Server.getUserID());
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Movie"+Server.getMoviesViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName&userId=" + Server.getUserID());
GuiDisplay_Series.start("Genre Movies",url1,0,0);
} else {
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Series"+Server.getTvViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,ItemCounts&userId=" + Server.getUserID());
var url1 = Server.getCustomURL("/Genres?format=json&SortBy=SortName&SortOrder=Ascending&IncludeItemTypes=Series"+Server.getTvViewQueryPart()+"&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName&userId=" + Server.getUserID());
GuiDisplay_Series.start("Genre TV",url1,0,0);
}
break;
Expand Down Expand Up @@ -429,11 +429,11 @@ GuiPage_MusicAZ.processTopMenuEnterKey = function() {
GuiDisplay_Series.start("Album Music",url,0,0);
break;
case "Album Artist":
var url = Server.getCustomURL("/Artists/AlbumArtists?format=json&SortBy=SortName&SortOrder=Ascending&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,Genres,ItemCounts&userId=" + Server.getUserID() + urlString);
var url = Server.getCustomURL("/Artists/AlbumArtists?format=json&SortBy=SortName&SortOrder=Ascending&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,Genres&userId=" + Server.getUserID() + urlString);
GuiPage_MusicArtist.start("Album Artist",url,0,0);
break;
case "Artist":
var url = Server.getCustomURL("/Artists?format=json&SortBy=SortName&SortOrder=Ascending&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,Genres,ItemCounts&userId=" + Server.getUserID() + urlString);
var url = Server.getCustomURL("/Artists?format=json&SortBy=SortName&SortOrder=Ascending&Recursive=true&ExcludeLocationTypes=Virtual&Fields=ParentId,SortName,Genres&userId=" + Server.getUserID() + urlString);
GuiDisplay_Series.start("Artist Music",url,0,0);
break;
case "TV":
Expand Down
16 changes: 13 additions & 3 deletions app/javascript/Gui/GuiPage_NewServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ GuiPage_NewServer.start = function() {

//Insert html into page
document.getElementById("pageContent").innerHTML = "<div class='GuiPage_NewServer12key'> \
<p style='padding-bottom:5px;'>Enter the IP address & port number of your Emby server. <br>(You can leave the port blank for 8096)</p> \
<p style='padding-bottom:5px;'>Enter the IP address & port number of your Jellyfin server. <br>(You can leave the port blank for 8096)</p> \
<form><input id='1' type='text' size='5' maxlength='3' value=''/>. \
<input id='2' type='text' size='5' maxlength='3' value=''/>. \
<input id='3' type='text' size='5' maxlength='3' value=''/>. \
<input id='4' type='text' size='5' maxlength='3' value=''/>: \
<input id='port' type='text' size='8' maxlength='5'/></form> \ \
<p style='padding-top:10px;padding-bottom:5px'>OR</p> \
<p style='padding-bottom:5px'>Enter your server hostname here without http:// and <br>including : and port number.</p> \
<form><input id='host' style='z-index:10;' type='text' size='45' value=''/></form> \
<form><input id='host' style='z-index:10;' type='text' size='45' maxlength='40' value=''/></form> \
</div>";

//Set Backdrop
Expand Down Expand Up @@ -81,7 +81,12 @@ var GuiPage_NewServer_Input = function(id,previousId, nextId) {

var ime = new IMEShell(id, imeReady,'en');
ime.setKeypadPos(1300,90);
ime.setMode('_num');

if (id == 'host') {
ime.setMode('_latin_small');
} else {
ime.setMode('_num');
}

var previousElement = document.getElementById(previousId);
var nextElement = document.getElementById(nextId);
Expand All @@ -106,6 +111,11 @@ var GuiPage_NewServer_Input = function(id,previousId, nextId) {
//not valid
GuiNotifications.setNotification("Please re-enter your server details.","Incorrect Details",true);
} else {
var Port = document.getElementById('port').value;
if (host.indexOf(":") === -1) {
host = host + ":" + (Port == "" ? "8096" : Port);
}

document.getElementById("pageContent").focus();
//Timeout required to allow notification command above to be displayed
setTimeout(function(){Server.testConnectionSettings(host,false);}, 1000);
Expand Down
Loading