|  | @@ -316,35 +316,26 @@ namespace MediaBrowser.Server.Implementations.Sync
 | 
	
		
			
				|  |  |              var video = item as Video;
 | 
	
		
			
				|  |  |              if (video != null)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                jobItem.OutputPath = await Sync(jobItem, video, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                await Sync(jobItem, video, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              else if (item is Audio)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                jobItem.OutputPath = await Sync(jobItem, (Audio)item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                await Sync(jobItem, (Audio)item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              else if (item is Photo)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                jobItem.OutputPath = await Sync(jobItem, (Photo)item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                await Sync(jobItem, (Photo)item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            else if (item is Game)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                jobItem.OutputPath = await Sync(jobItem, (Game)item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            else if (item is Book)
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                jobItem.OutputPath = await Sync(jobItem, (Book)item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                await SyncGeneric(jobItem, item, deviceProfile, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            jobItem.Progress = 50;
 | 
	
		
			
				|  |  | -            jobItem.Status = SyncJobItemStatus.Transferring;
 | 
	
		
			
				|  |  | -            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private async Task<string> Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  | +        private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var options = new VideoOptions
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -359,26 +350,33 @@ namespace MediaBrowser.Server.Implementations.Sync
 | 
	
		
			
				|  |  |              var mediaSource = streamInfo.MediaSource;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              jobItem.MediaSourceId = streamInfo.MediaSourceId;
 | 
	
		
			
				|  |  | -            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (streamInfo.PlayMethod != PlayMethod.Transcode)
 | 
	
		
			
				|  |  | +            if (streamInfo.PlayMethod == PlayMethod.Transcode)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (mediaSource.Protocol == MediaProtocol.File)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    return mediaSource.Path;
 | 
	
		
			
				|  |  | +                    jobItem.OutputPath = mediaSource.Path;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  if (mediaSource.Protocol == MediaProtocol.Http)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    return await DownloadFile(jobItem, mediaSource, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                    jobItem.OutputPath = await DownloadFile(jobItem, mediaSource, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  throw new InvalidOperationException(string.Format("Cannot direct stream {0} protocol", mediaSource.Protocol));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // TODO: Transcode
 | 
	
		
			
				|  |  | -            return mediaSource.Path;
 | 
	
		
			
				|  |  | +            jobItem.OutputPath = mediaSource.Path;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            jobItem.Progress = 50;
 | 
	
		
			
				|  |  | +            jobItem.Status = SyncJobItemStatus.Transferring;
 | 
	
		
			
				|  |  | +            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private async Task<string> Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  | +        private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var options = new AudioOptions
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -393,38 +391,48 @@ namespace MediaBrowser.Server.Implementations.Sync
 | 
	
		
			
				|  |  |              var mediaSource = streamInfo.MediaSource;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              jobItem.MediaSourceId = streamInfo.MediaSourceId;
 | 
	
		
			
				|  |  | -            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (streamInfo.PlayMethod != PlayMethod.Transcode)
 | 
	
		
			
				|  |  | +            if (streamInfo.PlayMethod == PlayMethod.Transcode)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  if (mediaSource.Protocol == MediaProtocol.File)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    return mediaSource.Path;
 | 
	
		
			
				|  |  | +                    jobItem.OutputPath = mediaSource.Path;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  if (mediaSource.Protocol == MediaProtocol.Http)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  | -                    return await DownloadFile(jobItem, mediaSource, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  | +                    jobItem.OutputPath = await DownloadFile(jobItem, mediaSource, cancellationToken).ConfigureAwait(false);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  throw new InvalidOperationException(string.Format("Cannot direct stream {0} protocol", mediaSource.Protocol));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // TODO: Transcode
 | 
	
		
			
				|  |  | -            return mediaSource.Path;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +            jobItem.OutputPath = mediaSource.Path;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private async Task<string> Sync(SyncJobItem jobItem, Photo item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            return item.Path;
 | 
	
		
			
				|  |  | +            jobItem.Progress = 50;
 | 
	
		
			
				|  |  | +            jobItem.Status = SyncJobItemStatus.Transferring;
 | 
	
		
			
				|  |  | +            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private async Task<string> Sync(SyncJobItem jobItem, Game item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  | +        private async Task Sync(SyncJobItem jobItem, Photo item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return item.Path;
 | 
	
		
			
				|  |  | +            jobItem.OutputPath = item.Path;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            jobItem.Progress = 50;
 | 
	
		
			
				|  |  | +            jobItem.Status = SyncJobItemStatus.Transferring;
 | 
	
		
			
				|  |  | +            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private async Task<string> Sync(SyncJobItem jobItem, Book item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  | +        private async Task SyncGeneric(SyncJobItem jobItem, BaseItem item, DeviceProfile profile, CancellationToken cancellationToken)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return item.Path;
 | 
	
		
			
				|  |  | +            jobItem.OutputPath = item.Path;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            jobItem.Progress = 50;
 | 
	
		
			
				|  |  | +            jobItem.Status = SyncJobItemStatus.Transferring;
 | 
	
		
			
				|  |  | +            await _syncRepo.Update(jobItem).ConfigureAwait(false);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private async Task<string> DownloadFile(SyncJobItem jobItem, MediaSourceInfo mediaSource, CancellationToken cancellationToken)
 |