예제 #1
0
    private void LoadDirectory(string newFolderName, bool useCache, HashSet<string> watchedFiles)
    {
      if (newFolderName == null)
      {
        Log.Warn("GUIVideoFiles::LoadDirectory called with invalid argument. newFolderName is null!");
        return;
      }

      if (facadeLayout == null)
      {
        return;
      }

      GUIWaitCursor.Show();
      GUIListItem selectedListItem = null;

      if (facadeLayout != null)
      {
        selectedListItem = facadeLayout.SelectedListItem;
      }
      if (selectedListItem != null)
      {
        if (selectedListItem.IsFolder && selectedListItem.Label != "..")
        {
          _history.Set(selectedListItem.Label, _currentFolder);
        }
      }

      if (newFolderName != _currentFolder && _mapSettings != null)
      {
        SaveFolderSettings(_currentFolder);
      }

      if (newFolderName != _currentFolder || _mapSettings == null)
      {
        LoadFolderSettings(newFolderName);
      }
      // Image file is not listed as a valid movie so we need to handle it 
      // as a folder and enable browsing for it
      if (VirtualDirectory.IsImageFile(Path.GetExtension(newFolderName)))
      {
        if (!MountImageFile(GetID, newFolderName, true))
          return;

        _currentFolder = DaemonTools.GetVirtualDrive();
      }
      else
      {
        _currentFolder = newFolderName;
      }
      string objectCount = string.Empty;

      if (facadeLayout != null)
      {
        GUIControl.ClearControl(GetID, facadeLayout.GetID);
      }


      List<GUIListItem> itemlist = null;

      //Tweak to boost performance when starting/stopping playback
      //For further details see comment in Core\Util\VirtualDirectory.cs
      if (useCache && _cachedDir == _currentFolder)
      {
        itemlist = _cachedItems;
        SelectDVDHandler selectDvdHandler = new SelectDVDHandler();

        foreach (GUIListItem item in itemlist)
        {
          if (watchedFiles != null && watchedFiles.Contains(item.Path))
          {
            item.IsPlayed = true;
          }
          else if (_markWatchedFiles &&
                   (item.IsFolder && selectDvdHandler.IsDvdDirectory(item.Path) || Util.Utils.IsVideo(item.Path)))
          {
            string file = item.Path;
            if (item.IsFolder)
              file = selectDvdHandler.GetFolderVideoFile(item.Path);
            // Check db for watched status for played movie or changed status in movie info window
            item.IsPlayed = VideoDatabase.GetmovieWatchedStatus(VideoDatabase.GetMovieId(file));
          }
          //Do NOT add OnItemSelected event handler here, because its still there...
          facadeLayout.Add(item);
        }
      }
      else
      {
        // here we get ALL files in every subdir, look for folderthumbs, defaultthumbs, etc
        itemlist = _virtualDirectory.GetDirectoryExt(_currentFolder);
        if (_mapSettings.Stack)
        {
          Dictionary<string, List<GUIListItem>> stackings = new Dictionary<string, List<GUIListItem>>(itemlist.Count);

          for (int i = 0; i < itemlist.Count; ++i)
          {
            GUIListItem item1 = itemlist[i];
            string cleanFilename = item1.Label;
            Util.Utils.RemoveStackEndings(ref cleanFilename);
            List<GUIListItem> innerList;
            if (stackings.TryGetValue(cleanFilename, out innerList))
            {
              for (int j = 0; j < innerList.Count; j++)
              {
                GUIListItem item2 = innerList[j];
                if ((!item1.IsFolder || !item2.IsFolder)
                    && (!item1.IsRemote && !item2.IsRemote)
                    && Util.Utils.ShouldStack(item1.Path, item2.Path))
                {
                  if (String.Compare(item1.Path, item2.Path, true) > 0)
                  {
                    item2.FileInfo.Length += item1.FileInfo.Length;
                  }
                  else
                  {
                    // keep item1, it's path is lexicographically before item2 path
                    item1.FileInfo.Length += item2.FileInfo.Length;
                    innerList[j] = item1;
                  }
                  item1 = null;
                  break;
                }
              }
              if (item1 != null) // not stackable
              {
                innerList.Add(item1);
              }
            }
            else
            {
              innerList = new List<GUIListItem> {item1};
              stackings.Add(cleanFilename, innerList);
            }
          }

          List<GUIListItem> itemfiltered = new List<GUIListItem>(itemlist.Count);
          foreach (KeyValuePair<string, List<GUIListItem>> pair in stackings)
          {
            List<GUIListItem> innerList = pair.Value;
            for (int i = 0; i < innerList.Count; i++)
            {
              GUIListItem item = innerList[i];
              if ((VirtualDirectory.IsValidExtension(item.Path, Util.Utils.VideoExtensions, false)))
                item.Label = pair.Key;
              itemfiltered.Add(item);
            }
          }
          itemlist = itemfiltered;
        }

        ISelectDVDHandler selectDVDHandler;
        if (GlobalServiceProvider.IsRegistered<ISelectDVDHandler>())
        {
          selectDVDHandler = GlobalServiceProvider.Get<ISelectDVDHandler>();
        }
        else
        {
          selectDVDHandler = new SelectDVDHandler();
          GlobalServiceProvider.Add<ISelectDVDHandler>(selectDVDHandler);
        }
        // folder.jpg will already be assigned from "itemlist = virtualDirectory.GetDirectory(_currentFolder);" here
        selectDVDHandler.SetIMDBThumbs(itemlist, _markWatchedFiles, _eachFolderIsMovie);

        foreach (GUIListItem item in itemlist)
        {
          item.OnItemSelected += new GUIListItem.ItemSelectedHandler(item_OnItemSelected);
          facadeLayout.Add(item);
        }

        _cachedItems = itemlist;
        _cachedDir = _currentFolder;
      }

      OnSort();

      bool itemSelected = false;

      //Sometimes the last selected item wasn't restored correcly after playback stop
      //The !useCache fixes this
      if (selectedListItem != null && !useCache)
      {
        string selectedItemLabel = _history.Get(_currentFolder);
        for (int i = 0; i < facadeLayout.Count; ++i)
        {
          GUIListItem item = facadeLayout[i];
          if (item.Label == selectedItemLabel)
          {
            GUIControl.SelectItemControl(GetID, facadeLayout.GetID, i);
            itemSelected = true;
            break;
          }
        }
      }
      int totalItems = itemlist.Count;
      if (itemlist.Count > 0)
      {
        GUIListItem rootItem = (GUIListItem)itemlist[0];
        if (rootItem.Label == "..")
        {
          totalItems--;
        }
      }

      //set object count label
      GUIPropertyManager.SetProperty("#itemcount", Util.Utils.GetObjectCountLabel(totalItems));

      if (!itemSelected)
      {
        UpdateButtonStates();
        SelectCurrentItem();
      }

      GUIWaitCursor.Hide();
    }
예제 #2
0
    private void SetMovieUnwatched(string movieFileName, bool isFolder)
    {
      SelectDVDHandler isDvdFolder = new SelectDVDHandler();

      if (isFolder && isDvdFolder.IsDvdDirectory(movieFileName))
        movieFileName = isDvdFolder.GetFolderVideoFile(movieFileName);

      if (VideoDatabase.HasMovieInfo(movieFileName))
      {
        IMDBMovie movieDetails = new IMDBMovie();
        int idMovie = VideoDatabase.GetMovieInfo(movieFileName, ref movieDetails);
        movieDetails.Watched = 0;
        VideoDatabase.SetWatched(movieDetails);
      }
      int idFile = VideoDatabase.GetFileId(movieFileName);
      VideoDatabase.DeleteMovieStopTime(idFile);
      VideoDatabase.SetMovieWatchedStatus(VideoDatabase.GetMovieId(movieFileName), false);
    }