Exemplo n.º 1
0
JSONRPC_STATUS CVideoLibrary::SetEpisodeDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
{
    int id = (int)parameterObject["episodeid"].asInteger();

    CVideoDatabase videodatabase;
    if (!videodatabase.Open())
        return InternalError;

    CVideoInfoTag infos;
    videodatabase.GetEpisodeInfo("", infos, id);
    if (infos.m_iDbId <= 0)
    {
        videodatabase.Close();
        return InvalidParams;
    }

    int tvshowid = videodatabase.GetTvShowForEpisode(id);
    if (tvshowid <= 0)
    {
        videodatabase.Close();
        return InvalidParams;
    }

    // get artwork
    std::map<std::string, std::string> artwork;
    videodatabase.GetArtForItem(infos.m_iDbId, infos.m_type, artwork);

    int playcount = infos.GetPlayCount();
    CDateTime lastPlayed = infos.m_lastPlayed;

    std::set<std::string> removedArtwork;
    std::set<std::string> updatedDetails;
    UpdateVideoTag(parameterObject, infos, artwork, removedArtwork, updatedDetails);

    if (videodatabase.SetDetailsForEpisode(infos.m_strFileNameAndPath, infos, artwork, tvshowid, id) <= 0)
        return InternalError;

    if (!videodatabase.RemoveArtForItem(infos.m_iDbId, MediaTypeEpisode, removedArtwork))
        return InternalError;

    if (playcount != infos.GetPlayCount() || lastPlayed != infos.m_lastPlayed)
    {
        // restore original playcount or the new one won't be announced
        int newPlaycount = infos.GetPlayCount();
        infos.SetPlayCount(playcount);
        videodatabase.SetPlayCount(CFileItem(infos), newPlaycount, infos.m_lastPlayed);
    }

    UpdateResumePoint(parameterObject, infos, videodatabase);

    CJSONRPCUtils::NotifyItemUpdated();
    return ACK;
}
Exemplo n.º 2
0
JSONRPC_STATUS CVideoLibrary::SetMusicVideoDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
{
    int id = (int)parameterObject["musicvideoid"].asInteger();

    CVideoDatabase videodatabase;
    if (!videodatabase.Open())
        return InternalError;

    CVideoInfoTag infos;
    videodatabase.GetMusicVideoInfo("", infos, id);
    if (infos.m_iDbId <= 0)
    {
        videodatabase.Close();
        return InvalidParams;
    }

    // get artwork
    std::map<std::string, std::string> artwork;
    videodatabase.GetArtForItem(infos.m_iDbId, infos.m_type, artwork);

    int playcount = infos.GetPlayCount();
    CDateTime lastPlayed = infos.m_lastPlayed;

    std::set<std::string> removedArtwork;
    std::set<std::string> updatedDetails;
    UpdateVideoTag(parameterObject, infos, artwork, removedArtwork, updatedDetails);

    // we need to manually remove tags/taglinks for now because they aren't replaced
    // due to scrapers not supporting them
    videodatabase.RemoveTagsFromItem(id, MediaTypeMusicVideo);

    if (videodatabase.SetDetailsForMusicVideo(infos.m_strFileNameAndPath, infos, artwork, id) <= 0)
        return InternalError;

    if (!videodatabase.RemoveArtForItem(infos.m_iDbId, MediaTypeMusicVideo, removedArtwork))
        return InternalError;

    if (playcount != infos.GetPlayCount()|| lastPlayed != infos.m_lastPlayed)
    {
        // restore original playcount or the new one won't be announced
        int newPlaycount = infos.GetPlayCount();
        infos.SetPlayCount(playcount);
        videodatabase.SetPlayCount(CFileItem(infos), newPlaycount, infos.m_lastPlayed);
    }

    UpdateResumePoint(parameterObject, infos, videodatabase);

    CJSONRPCUtils::NotifyItemUpdated();
    return ACK;
}
Exemplo n.º 3
0
static void ParseItemZink(CFileItem* item, SResources& resources, TiXmlElement* element, const std::string& name, const std::string& xmlns, const std::string& path)
{
  CVideoInfoTag* vtag = item->GetVideoInfoTag();
  std::string text = GetValue(element);
  if     (name == "episode")
    vtag->m_iEpisode = atoi(text.c_str());
  else if(name == "season")
    vtag->m_iSeason = atoi(text.c_str());
  else if(name == "views")
    vtag->SetPlayCount(atoi(text.c_str()));
  else if(name == "airdate")
    vtag->m_firstAired.SetFromDateString(text);
  else if(name == "userrating")
    vtag->SetRating((float)atof(text.c_str()));
  else if(name == "duration")
    vtag->SetDuration(atoi(text.c_str()));
  else if(name == "durationstr")
    vtag->SetDuration(StringUtils::TimeStringToSeconds(text));
}
Exemplo n.º 4
0
static void ParseItemBoxee(CFileItem* item, SResources& resources, TiXmlElement* element, const std::string& name, const std::string& xmlns, const std::string& path)
{
  CVideoInfoTag* vtag = item->GetVideoInfoTag();
  std::string text = GetValue(element);

  if     (name == "image")
    item->SetArt("thumb", text);
  else if(name == "user_agent")
    item->SetProperty("boxee:user_agent", text);
  else if(name == "content_type")
    item->SetMimeType(text);
  else if(name == "runtime")
    vtag->SetDuration(StringUtils::TimeStringToSeconds(text));
  else if(name == "episode")
    vtag->m_iEpisode = atoi(text.c_str());
  else if(name == "season")
    vtag->m_iSeason = atoi(text.c_str());
  else if(name == "view-count")
    vtag->SetPlayCount(atoi(text.c_str()));
  else if(name == "tv-show-title")
    vtag->m_strShowTitle = text;
  else if(name == "release-date")
    item->SetProperty("boxee:releasedate", text);
}
Exemplo n.º 5
0
static void ParseItemMRSS(CFileItem* item, SResources& resources, TiXmlElement* item_child, const std::string& name, const std::string& xmlns, const std::string& path)
{
  CVideoInfoTag* vtag = item->GetVideoInfoTag();
  std::string text = GetValue(item_child);

  if(name == "content")
  {
    SResource res;
    res.tag = "media:content";
    res.mime    = XMLUtils::GetAttribute(item_child, "type");
    res.path    = XMLUtils::GetAttribute(item_child, "url");
    item_child->Attribute("width", &res.width);
    item_child->Attribute("height", &res.height);
    item_child->Attribute("bitrate", &res.bitrate);
    item_child->Attribute("duration", &res.duration);
    if(item_child->Attribute("fileSize"))
      res.size     = _atoi64(item_child->Attribute("fileSize"));

    resources.push_back(res);
    ParseItem(item, resources, item_child, path);
  }
  else if(name == "group")
  {
    ParseItem(item, resources, item_child, path);
  }
  else if(name == "thumbnail")
  {
    if(!item_child->NoChildren() && IsPathToThumbnail(item_child->FirstChild()->ValueStr()))
      item->SetArt("thumb", item_child->FirstChild()->ValueStr());
    else
    {
      const char * url = item_child->Attribute("url");
      if(url && IsPathToThumbnail(url))
        item->SetArt("thumb", url);
    }
  }
  else if (name == "title")
  {
    if(text.empty())
      return;

    if(text.length() > item->m_strTitle.length())
      item->m_strTitle = text;
  }
  else if(name == "description")
  {
    if(text.empty())
      return;

    std::string description = text;
    if(XMLUtils::GetAttribute(item_child, "type") == "html")
      HTML::CHTMLUtil::RemoveTags(description);
    item->SetProperty("description", description);
  }
  else if(name == "category")
  {
    if(text.empty())
      return;

    std::string scheme = XMLUtils::GetAttribute(item_child, "scheme");

    /* okey this is silly, boxee what did you think?? */
    if     (scheme == "urn:boxee:genre")
      vtag->m_genre.push_back(text);
    else if(scheme == "urn:boxee:title-type")
    {
      if     (text == "tv")
        item->SetProperty("boxee:istvshow", true);
      else if(text == "movie")
        item->SetProperty("boxee:ismovie", true);
    }
    else if(scheme == "urn:boxee:episode")
      vtag->m_iEpisode = atoi(text.c_str());
    else if(scheme == "urn:boxee:season")
      vtag->m_iSeason  = atoi(text.c_str());
    else if(scheme == "urn:boxee:show-title")
      vtag->m_strShowTitle = text.c_str();
    else if(scheme == "urn:boxee:view-count")
      vtag->SetPlayCount(atoi(text.c_str()));
    else if(scheme == "urn:boxee:source")
      item->SetProperty("boxee:provider_source", text);
    else
      vtag->m_genre = StringUtils::Split(text, g_advancedSettings.m_videoItemSeparator);
  }
  else if(name == "rating")
  {
    std::string scheme = XMLUtils::GetAttribute(item_child, "scheme");
    if(scheme == "urn:user")
      vtag->SetRating((float)atof(text.c_str()));
    else
      vtag->m_strMPAARating = text;
  }
  else if(name == "credit")
  {
    std::string role = XMLUtils::GetAttribute(item_child, "role");
    if     (role == "director")
      vtag->m_director.push_back(text);
    else if(role == "author"
         || role == "writer")
      vtag->m_writingCredits.push_back(text);
    else if(role == "actor")
    {
      SActorInfo actor;
      actor.strName = text;
      vtag->m_cast.push_back(actor);
    }
  }
  else if(name == "copyright")
    vtag->m_studio = StringUtils::Split(text, g_advancedSettings.m_videoItemSeparator);
  else if(name == "keywords")
    item->SetProperty("keywords", text);

}
Exemplo n.º 6
0
void CVideoLibrary::UpdateVideoTag(const CVariant &parameterObject, CVideoInfoTag& details, std::map<std::string, std::string> &artwork, std::set<std::string> &removedArtwork, std::set<std::string> &updatedDetails)
{
    if (ParameterNotNull(parameterObject, "title"))
        details.SetTitle(parameterObject["title"].asString());
    if (ParameterNotNull(parameterObject, "playcount"))
        details.SetPlayCount(static_cast<int>(parameterObject["playcount"].asInteger()));
    if (ParameterNotNull(parameterObject, "runtime"))
        details.SetDuration(static_cast<int>(parameterObject["runtime"].asInteger()));

    std::vector<std::string> director(details.m_director);
    UpdateVideoTagField(parameterObject, "director", director, updatedDetails);
    details.SetDirector(director);

    std::vector<std::string> studio(details.m_studio);
    UpdateVideoTagField(parameterObject, "studio", studio, updatedDetails);
    details.SetStudio(studio);

    if (ParameterNotNull(parameterObject, "plot"))
        details.SetPlot(parameterObject["plot"].asString());
    if (ParameterNotNull(parameterObject, "album"))
        details.SetAlbum(parameterObject["album"].asString());

    std::vector<std::string> artist(details.m_artist);
    UpdateVideoTagField(parameterObject, "artist", artist, updatedDetails);
    details.SetArtist(artist);

    std::vector<std::string> genre(details.m_genre);
    UpdateVideoTagField(parameterObject, "genre", genre, updatedDetails);
    details.SetGenre(genre);

    if (ParameterNotNull(parameterObject, "track"))
        details.m_iTrack = (int)parameterObject["track"].asInteger();
    if (ParameterNotNull(parameterObject, "rating"))
    {
        details.SetRating(parameterObject["rating"].asFloat());
        updatedDetails.insert("ratings");
    }
    if (ParameterNotNull(parameterObject, "votes"))
    {
        details.SetVotes(StringUtils::ReturnDigits(parameterObject["votes"].asString()));
        updatedDetails.insert("ratings"); //Votes and ratings both need updates now, this will trigger those
    }
    if (ParameterNotNull(parameterObject, "ratings"))
    {
        CVariant ratings = parameterObject["ratings"];
        for (CVariant::const_iterator_map rIt = ratings.begin_map(); rIt != ratings.end_map(); rIt++)
        {
            if (rIt->second.isObject() && ParameterNotNull(rIt->second, "rating"))
            {
                const auto& rating = rIt->second;
                if (ParameterNotNull(rating, "votes"))
                    details.SetRating(rating["rating"].asFloat(), rating["votes"].asFloat(), rIt->first, (ParameterNotNull(rating, "default") && rating["default"].asBoolean()));
                else
                    details.SetRating(rating["rating"].asFloat(), rIt->first, (ParameterNotNull(rating, "default") && rating["default"].asBoolean()));

                updatedDetails.insert("ratings");
            }
            else if (rIt->second.isNull())
            {
                details.RemoveRating(rIt->first);
                updatedDetails.insert("ratings");
            }
        }
    }
    if (ParameterNotNull(parameterObject, "userrating"))
        details.m_iUserRating = parameterObject["userrating"].asInteger();
    if (ParameterNotNull(parameterObject, "mpaa"))
        details.SetMPAARating(parameterObject["mpaa"].asString());
    if (ParameterNotNull(parameterObject, "imdbnumber"))
    {
        details.SetUniqueID(parameterObject["imdbnumber"].asString());
        updatedDetails.insert("uniqueid");
    }
    if (ParameterNotNull(parameterObject, "uniqueid"))
    {
        CVariant uniqueids = parameterObject["uniqueid"];
        for (CVariant::const_iterator_map idIt = uniqueids.begin_map(); idIt != uniqueids.end_map(); idIt++)
        {
            if (idIt->second.isString() && !idIt->second.asString().empty())
            {
                details.SetUniqueID(idIt->second.asString(), idIt->first);
                updatedDetails.insert("uniqueid");
            }
            else if (idIt->second.isNull() && idIt->first != details.GetDefaultUniqueID())
            {
                details.RemoveUniqueID(idIt->first);
                updatedDetails.insert("uniqueid");
            }
        }
    }
    if (ParameterNotNull(parameterObject, "premiered"))
    {
        CDateTime premiered;
        SetFromDBDate(parameterObject["premiered"], premiered);
        details.SetPremiered(premiered);
    }
    else if (ParameterNotNull(parameterObject, "year"))
        details.SetYear((int)parameterObject["year"].asInteger());
    if (ParameterNotNull(parameterObject, "lastplayed"))
        SetFromDBDateTime(parameterObject["lastplayed"], details.m_lastPlayed);
    if (ParameterNotNull(parameterObject, "firstaired"))
        SetFromDBDate(parameterObject["firstaired"], details.m_firstAired);
    if (ParameterNotNull(parameterObject, "productioncode"))
        details.SetProductionCode(parameterObject["productioncode"].asString());
    if (ParameterNotNull(parameterObject, "season"))
        details.m_iSeason = (int)parameterObject["season"].asInteger();
    if (ParameterNotNull(parameterObject, "episode"))
        details.m_iEpisode = (int)parameterObject["episode"].asInteger();
    if (ParameterNotNull(parameterObject, "originaltitle"))
        details.SetOriginalTitle(parameterObject["originaltitle"].asString());
    if (ParameterNotNull(parameterObject, "trailer"))
        details.SetTrailer(parameterObject["trailer"].asString());
    if (ParameterNotNull(parameterObject, "tagline"))
        details.SetTagLine(parameterObject["tagline"].asString());
    if (ParameterNotNull(parameterObject, "status"))
        details.SetStatus(parameterObject["status"].asString());
    if (ParameterNotNull(parameterObject, "plotoutline"))
        details.SetPlotOutline(parameterObject["plotoutline"].asString());

    std::vector<std::string> credits(details.m_writingCredits);
    UpdateVideoTagField(parameterObject, "writer", credits, updatedDetails);
    details.SetWritingCredits(credits);

    std::vector<std::string> country(details.m_country);
    UpdateVideoTagField(parameterObject, "country", country, updatedDetails);
    details.SetCountry(country);

    if (ParameterNotNull(parameterObject, "top250"))
        details.m_iTop250 = (int)parameterObject["top250"].asInteger();
    if (ParameterNotNull(parameterObject, "sorttitle"))
        details.SetSortTitle(parameterObject["sorttitle"].asString());
    if (ParameterNotNull(parameterObject, "episodeguide"))
        details.SetEpisodeGuide(parameterObject["episodeguide"].asString());
    if (ParameterNotNull(parameterObject, "set"))
    {
        details.SetSet(parameterObject["set"].asString());
        updatedDetails.insert("set");
    }

    std::vector<std::string> showLink(details.m_showLink);
    UpdateVideoTagField(parameterObject, "showlink", showLink, updatedDetails);
    details.SetShowLink(showLink);

    std::vector<std::string> tags(details.m_tags);
    UpdateVideoTagField(parameterObject, "tag", tags, updatedDetails);
    details.SetTags(tags);

    if (ParameterNotNull(parameterObject, "thumbnail"))
    {
        std::string value = parameterObject["thumbnail"].asString();
        artwork["thumb"] = StringUtils::Trim(value);
        updatedDetails.insert("art.altered");
    }
    if (ParameterNotNull(parameterObject, "fanart"))
    {
        std::string value = parameterObject["fanart"].asString();
        artwork["fanart"] = StringUtils::Trim(value);
        updatedDetails.insert("art.altered");
    }

    if (ParameterNotNull(parameterObject, "art"))
    {
        CVariant art = parameterObject["art"];
        for (CVariant::const_iterator_map artIt = art.begin_map(); artIt != art.end_map(); artIt++)
        {
            if (artIt->second.isString() && !artIt->second.asString().empty())
            {
                artwork[artIt->first] = CTextureUtils::UnwrapImageURL(artIt->second.asString());
                updatedDetails.insert("art.altered");
            }
            else if (artIt->second.isNull())
            {
                artwork.erase(artIt->first);
                removedArtwork.insert(artIt->first);
            }
        }
    }

    if (ParameterNotNull(parameterObject, "dateadded"))
    {
        SetFromDBDateTime(parameterObject["dateadded"], details.m_dateAdded);
        updatedDetails.insert("dateadded");
    }
}