JSONRPC_STATUS CVideoLibrary::SetEpisodeDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, 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; }
JSONRPC_STATUS CVideoLibrary::SetMusicVideoDetails(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, 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; }
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)); }
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); }
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); }
void CVideoLibrary::UpdateVideoTag(const CVariant ¶meterObject, 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"); } }