Repository: xbmc/xbmc
File: xbmc/utils/SaveFileStateJob.cpp (C++)

Code before:

        if (item.HasVideoInfoTag() && item.GetVideoInfoTag()->HasStreamDetails() &&
            !item.IsLiveTV())
        {
          CFileItem dbItem(item);

          // Check whether the item's db streamdetails need updating
          if (!videodatabase.GetStreamDetails(dbItem) ||
              dbItem.GetVideoInfoTag()->m_streamDetails != item.GetVideoInfoTag()->m_streamDetails)
          {
            videoDbSuccess = videodatabase.SetStreamDetailsForFile(
                item.GetVideoInfoTag()->m_streamDetails, progressTrackingFile);
            updateListing = !videoDbSuccess;
          }
        }

        // See if fileId needs updating
        if (URIUtils::IsBluray(item.GetDynPath()))
        {
          if (item.GetVideoContentType() == VideoDbContentType::MOVIES)
          {
            const CVideoInfoTag* tag{item.GetVideoInfoTag()};
            if (tag->m_strFileNameAndPath != item.GetDynPath())
            {
              const int currentFileId{videodatabase.GetFileIdByMovie(tag->m_iDbId)};
              videoDbSuccess |= videodatabase.SetFileForMovie(item.GetDynPath(), currentFileId);
            }
          }
          else if (item.GetVideoContentType() == VideoDbContentType::EPISODES)
          {
            const CVideoInfoTag* tag{item.GetVideoInfoTag()};
            if (tag->m_strFileNameAndPath != item.GetDynPath())
            {
              const int currentFileId{videodatabase.GetFileIdByEpisode(tag->m_iDbId)};
              videoDbSuccess |= videodatabase.SetFileForEpisode(
                  item.GetDynPath(), item.GetVideoInfoTag()->m_iDbId, currentFileId);
            }
          }
        }

        if (videoDbSuccess)
          videodatabase.CommitTransaction();
        else
          videodatabase.RollbackTransaction();

        if (updateListing)
        {
          CUtil::DeleteVideoDatabaseDirectoryCache();
          CFileItemPtr msgItem(new CFileItem(item));
          if (item.HasProperty("original_listitem_url"))
            msgItem->SetPath(item.GetProperty("original_listitem_url").asString());

Review comment (suggestion):
I don't think that's going to work for versions that are not the default version of a movie. If tag->m_iFileId points to the originally played file, then it could be used and eliminate the need for GetFileIdByMovie at the same time.
For safety, passing the iDbId and the current file id to SetFileForMovie would be good.

Code after:

        //! @todo videoDBSuccess will always be true as not updated yet for play count and bookmark changes
        if (videoDbSuccess)
          videodatabase.CommitTransaction();
        else
          videodatabase.RollbackTransaction();
        videodatabase.BeginTransaction();

        if (item.HasVideoInfoTag() && item.GetVideoInfoTag()->HasStreamDetails() &&
            !item.IsLiveTV())
        {
          CFileItem dbItem(item);

          // Check whether the item's db streamdetails need updating
          if (!videodatabase.GetStreamDetails(dbItem) ||
              dbItem.GetVideoInfoTag()->m_streamDetails != item.GetVideoInfoTag()->m_streamDetails)
          {
            videoDbSuccess = videodatabase.SetStreamDetailsForFile(
                item.GetVideoInfoTag()->m_streamDetails, progressTrackingFile);
            updateListing = !videoDbSuccess;
          }
        }

        if (videoDbSuccess)
          videodatabase.CommitTransaction();
        else
          videodatabase.RollbackTransaction();
        videodatabase.BeginTransaction();
        videoDbSuccess = true;

        // See if idFile needs updating
        if (item.HasVideoInfoTag() && URIUtils::IsBlurayPath(item.GetDynPath()))
        {
          if (item.GetVideoContentType() == VideoDbContentType::MOVIES)
          {
            const CVideoInfoTag* tag{item.GetVideoInfoTag()};
            if (tag->m_strFileNameAndPath != item.GetDynPath())
              // tag->m_iFileId contains the idFile played and may be different to the idFile in the movie table entry if it's
              // a non-default video version
              videoDbSuccess =
                  videodatabase.SetFileForMovie(item.GetDynPath(), tag->m_iDbId, tag->m_iFileId);
          }
          else if (item.GetVideoContentType() == VideoDbContentType::EPISODES)
          {
            const CVideoInfoTag* tag{item.GetVideoInfoTag()};
            if (tag->m_strFileNameAndPath != item.GetDynPath())
              videoDbSuccess =
                  videodatabase.SetFileForEpisode(item.GetDynPath(), tag->m_iDbId, tag->m_iFileId);
          }
        }