Skip to content

Instantly share code, notes, and snippets.

@mschnitzler
Last active March 23, 2018 19:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mschnitzler/6994adeaea8de8c65e51 to your computer and use it in GitHub Desktop.
Save mschnitzler/6994adeaea8de8c65e51 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Yahoo Fantasy Baseball Batter vs Pitcher Career Stats
// @namespace http://baseball.fantasysports.yahoo.com/
// @version 0.4.3
// @description displays batter vs pitcher career stats
// @author Michael Schnitzler
// @match https://baseball.fantasysports.yahoo.com/b1/*/*
// @grant none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
function replaceIllegalCharacters(s) {
s = s.split('á').join('a');
s = s.split('í').join('i');
s = s.split('ó').join('o');
s = s.split('é').join('e');
s = s.split('ñ').join('n');
s = s.split('Á').join('A');
s = s.split('ú').join('u');
return s;
}
function getMLBPlayerId(name) {
var playerId;
var sname = replaceIllegalCharacters(name);
var url = 'https://lookup-service-prod.mlb.com/json/named.search_player_all.bam?sport_code=%27mlb%27&name_part=%27' + encodeURIComponent(sname) + '%25%27&active_sw=%27Y%27';
$.ajax({async: false,
url: url,
dataType: "json",
success: function(data) {
if (data.search_player_all.queryResults.totalSize=='1') {
playerId = data.search_player_all.queryResults.row.player_id;
}
else if (data.search_player_all.queryResults.totalSize>1) {
}
},
error: function(data) {
alert('error');
}
});
//$.getJSON(url, function(data) {
// playerId = data.search_player_all.queryResults.row.player_id;
// alert(playerId);
// });
//alert(playerId);
return playerId;
}
function getBatterVsPitcherStats(batterId, pitcherId) {
url = 'https://lookup-service-prod.mlb.com/json/named.stats_batter_vs_pitcher_composed.bam?sport_code=%27mlb%27&game_type=%27R%27&player_id=' + batterId + '&pitcher_id=' + pitcherId;
var stats;
$.ajax({async:false,
url: url,
dataType: 'json',
success: function(data) {
stats = data;}
});
return stats;
}
function getLvsRStats(playerId) {
var stats = new Object();
var url = 'https://lookup-service-prod.mlb.com/json/named.mlb_individual_hitting_sits_composed.bam?sport_code=%27mlb%27&game_type=%27R%27&player_id=' + playerId + '&sit_code=%27vl%27&sit_code=%27vr%27';
$.ajax({async:false,
url: url,
dataType: 'json',
success: function(data) {
var l = new Array();
var r = new Array();
for (i=0;i<data.mlb_individual_hitting_sits_composed.mlb_individual_hitting_sits_season_total.queryResults.totalSize;i++) {
var row;
if (data.mlb_individual_hitting_sits_composed.mlb_individual_hitting_sits_season_total.queryResults.totalSize==1) {
row = data.mlb_individual_hitting_sits_composed.mlb_individual_hitting_sits_season_total.queryResults.row;
}
else {
row = data.mlb_individual_hitting_sits_composed.mlb_individual_hitting_sits_season_total.queryResults.row[i];
}
if (row.sit_code=='vl') {
l.push(row);
}
else if (row.sit_code=='vr') {
r.push(row);
}
}
var lh=0, lab=0, ltb=0, rh=0, rab=0, rtb=0;
for(i=0;i<l.length;i++) {
lh = lh + parseInt(l[i].h);
lab = lab + parseInt(l[i].ab);
ltb = ltb + parseInt(l[i].tb);
}
for(i=0;i<r.length;i++) {
rh = rh + parseInt(r[i].h);
rab = rab + parseInt(r[i].ab);
rtb = rtb + parseInt(r[i].tb);
}
stats.lavg = (lh / lab).toFixed(3);
stats.lslg = (ltb / lab).toFixed(3);
stats.ravg = (rh / rab).toFixed(3);
stats.rslg = (rtb / rab).toFixed(3);
}
});
return stats;
}
var opponentsLink = $("a:contains('Opponents')").attr("href");
$('.Grid-u.Ta-end.Nowrap').prepend('<a class="Btn Btn-short Mend-med" href="' + opponentsLink + '">Batter vs. Pitcher</a>');
if (window.location.href.indexOf("stat1=O") > -1) {
$('<th>Career Stats</th>').insertAfter('table#statTable0 > thead > tr > th:contains("Batters")');
$('table#statTable0 > tbody > tr').each(function(rowNum,row) {
//var playerName = $(row).children('td.player > div > div > div.ysf-player-name > a').text();
// get batter's player id
var playerName = $(row).find('td > div > div > div.ysf-player-name > a').text();
var playerId = getMLBPlayerId(playerName);
// get pitcher's player id
var pitcherName = $(row).find('td > div > a.name').text();
var pitcherHandLong = $(row).find('td > div > div.detail > span:first').text();
var pitcherHand = (pitcherHandLong!=null) ? pitcherHandLong.substring(0,3) : "";
var pitcherId = getMLBPlayerId(pitcherName);
var stats;
var avg0, avg1, slg0, slg1, sit0, sit1;
var splitStats;
if (playerId!=null) {
stats = getLvsRStats(playerId);
var lstat = 'vs LHP: ' + stats.lavg + ' ' + stats.lslg;
var rstat = 'vs RHP: ' + stats.ravg + ' ' + stats.rslg;
if (pitcherHand=='LHP') {
var lcol = (stats.lavg>=.280) ? "green" : "red";
lstat = '<b style="color:' + lcol + '">' + lstat + '</b>';
}
else if (pitcherHand=='RHP') {
var rcol = (stats.ravg>=.280) ? "green" : "red";
rstat = '<b style="color:' + rcol + '">' + rstat + '</b>';
}
splitStats = '<br>' + lstat + '<br>' + rstat;
}
if(playerId!=null && pitcherId!=null) {
stats = getBatterVsPitcherStats(playerId, pitcherId);
var avg = stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.avg;
var slg = stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.slg;
var h = stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.h;
var ab = stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.ab;
var hr = stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.hr;
var so = stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.so;
var color = (avg>=.280) ? 'green' : 'red';
var batterVsPitcherStats = '';
if (stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.h!="") {
batterVsPitcherStats = '<b style="color:'+color+'">' + avg + '</b> ('+h+'/'+ab+')<br>'+ hr + ' HR, ' + so + 'SO';
}
if (stats.stats_batter_vs_pitcher_composed.stats_batter_vs_pitcher_total.queryResults.row.h!=null) {
$('<td class="Nowrap Fz-xxs Bdrend"><div>' + batterVsPitcherStats + splitStats + '</div></td>').insertAfter($(row).find('td.player'));
}
else {
$('<td class="Nowrap Bdrend"></td>').insertAfter($(row).find('td.player'));
}
}
else {
$('<td class="Nowrap Bdrend"></td>').insertAfter($(row).find('td.player'));
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment