Changeset 105
- Timestamp:
- 10/19/06 23:42:09 (7 years ago)
- Files:
-
- 2 modified
-
reconcilers/reconciler_mk2 (modified) (22 diffs)
-
status (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
reconcilers/reconciler_mk2
r89 r105 19 19 # 0.06 17aug06 enhancement: name mapping based on previously learnt names 20 20 # 0.07 19aug06 turn down debugging 21 # 0.08 20aug06 improved preference-title rewriter, more debugging to logfile 21 22 22 23 # … … 71 72 # duplicate checking: $in->{dupcheck}->{$source}->{$prog_chan}->{$prog_key} 72 73 # channel list: $in->{channels}->{$chan}->{$lang} = $desc 73 74 # 75 # used translations $in->{used_translations}->{$xlate_to}->{num}=count 76 # $in->{used_translations}->{$xlate_to}->{from}->{$xlate_from}=count 77 78 # history of title preferences uses the following (cache-based) data: 79 # $title_xlate_table->{"$primary_title"}->{seen_in_primary} = count 80 # $title_xlate_table->{"$primary_title"}->{last_seen_in_primary} = time 81 # $title_xlate_table->{"$primary_title"}->{translated} = count 82 # $title_xlate_table->{"$primary_title"}->{translation} = title 83 # $title_xlate_table->{"$primary_title"}->{alternate}->{"$alt_title"}->{secondary}->{"$source"} = count 84 # $title_xlate_table->{"$primary_title"}->{alternate}->{"$alt_title"}->{last_seen_in_secondary} = time 85 # $title_xlate_table->{"$primary_title"}->{same}->{"$source"} = count 74 86 75 87 use strict; … … 78 90 79 91 my $progname = "reconciler_mk2"; 80 my $version = "0.0 7_19aug06";92 my $version = "0.08_20aug06"; 81 93 82 94 use LWP::UserAgent; … … 127 139 $reclogic{max_programme_length} = (8 * 60 * 60); # 8 hours 128 140 141 # do store a preference title, even if we don't have any alternatives 142 $reclogic{title_xlate_table_min_alt_progs} = 0; 129 143 130 144 # … … 176 190 my $setting_override; 177 191 my %cli_override; 178 my $title_ map_table;192 my $title_xlate_table; # cached 179 193 180 194 my %amp; … … 188 202 my $opt = { }; 189 203 $opt->{output_file} = cwd()."/output.xmltv"; 190 $opt->{config_file} = cwd()."/".$progname.".conf ";204 $opt->{config_file} = cwd()."/".$progname.".config"; 191 205 $opt->{log_file} = cwd()."/".$progname.".log"; 192 206 $opt->{alt_title_file} = cwd()."/".$progname.".alt_title.log"; … … 347 361 open(CONF, ">$opt->{config_file}") || die "cannot write to $opt->{config_file}: $!"; 348 362 print CONF Data::Dumper->Dump( 349 [$setting_override, $title_ map_table ],350 ["setting_override", "title_ map_table" ]);363 [$setting_override, $title_xlate_table ], 364 ["setting_override", "title_xlate_table" ]); 351 365 close CONF; 352 366 &log(1,(sprintf "updated configuration file %s.\n",$opt->{config_file})); … … 489 503 my ($log_level,$entry) = @_; 490 504 printf STDERR "%s [%d] %s\n",$progname, time,$entry if ($log_level); 491 printf LOG_FILE "%s [%d] %s\n",$progname, time,$entry if (($log_level) && (!$opt->{nolog})); 505 #printf LOG_FILE "%s [%d] %s\n",$progname, time,$entry if (($log_level) && (!$opt->{nolog})); 506 printf LOG_FILE "%s [%d] %s\n",$progname, time,$entry unless ($opt->{nolog}); 492 507 } 493 508 … … 553 568 printf ALT_TITLE_FILE "(1) The following list shows title translations that were used:\n\n"; 554 569 555 printf ALT_TITLE_FILE " Preferred Title (translated to) Translated From Seen\n"; 556 printf ALT_TITLE_FILE " -------------------------------- ------------------------------ -----\n"; 557 my $used = $in->{used_translations}; 558 foreach my $key (sort { $used->{$b}->{num} <=> $used->{$a}->{num} } keys %{$used}) { 559 my $used2 = $used->{$key}->{from}; 560 foreach my $key2 (sort { $used2->{$a} <=> $used2->{$b} } keys %{$used2}) { 561 printf ALT_TITLE_FILE " %-32s %-30s %5d\n", $key, $key2, $used2->{$key2}; 570 printf ALT_TITLE_FILE " Times Preferred Title (translated to) Translated from Times\n"; 571 printf ALT_TITLE_FILE " ----- -------------------------------- ------------------------------ -----\n"; 572 my $u = $in->{used_translations}; 573 foreach my $xlate_to (sort { $u->{$b}->{num} <=> $u->{$a}->{num} } keys %{$u}) { 574 printf ALT_TITLE_FILE " %5d %-32s", $u->{$xlate_to}->{num},$xlate_to; 575 576 my $u2 = $u->{$xlate_to}->{from}; 577 my $num = 0; 578 foreach my $xlate_from (sort { $u2->{$a} <=> $u2->{$b} } keys %{$u2}) { 579 printf ALT_TITLE_FILE "%s %-30s %5d\n", 580 ($num > 0 ? " " : ""), 581 $xlate_from, $u2->{$xlate_from}; 582 $num++; 562 583 } 563 584 } … … 565 586 printf ALT_TITLE_FILE "\n==========================================================================================================\n\n"; 566 587 printf ALT_TITLE_FILE "(2) The following table lists ALL the translations we have stored:\n\n"; 567 printf ALT_TITLE_FILE " Preferred title (xlate to) Translated From Last used (total) Last seen (total)\n"; 568 printf ALT_TITLE_FILE " ---------------------------------- ---------------------------------- ----------------- -----------------\n"; 569 570 foreach my $key (sort keys %{$title_map_table}) { 571 my $xlate_to = $title_map_table->{$key}; 572 foreach my $key2 (sort keys %{$xlate_to}) { 573 printf ALT_TITLE_FILE " %-34s %-34s %-10s %6d %-10s %6d\n", 574 substr($key2,0,34), substr($key,0,34), 575 ($title_map_table->{$key}->{$key2}->{last_translated} ? 576 (strftime "%a%e%b%y",localtime($title_map_table->{$key}->{$key2}->{last_translated})) : "never"), 577 ($title_map_table->{$key}->{$key2}->{times_translated} ? 578 $title_map_table->{$key}->{$key2}->{times_translated} : 0), 579 ($title_map_table->{$key}->{$key2}->{last_seen} ? 580 (strftime "%a%e%b%y",localtime($title_map_table->{$key}->{$key2}->{last_seen})) : "never"), 581 ($title_map_table->{$key}->{$key2}->{times_seen} ? 582 $title_map_table->{$key}->{$key2}->{times_seen} : 0); 583 } 588 printf ALT_TITLE_FILE "+Preferred title (xlate to) xlate_ preferred title seen in source (times)\n"; 589 printf ALT_TITLE_FILE "-Alternate title (xlate from) times alternate title seen in source (times)\n"; 590 printf ALT_TITLE_FILE " ---------------------------------- ------- --------------------------------------------------------------\n"; 591 592 foreach my $xlate_to (sort { $title_xlate_table->{$b}->{translated} <=> $title_xlate_table->{$a}->{translated} } keys %{$title_xlate_table}) { 593 printf ALT_TITLE_FILE "+%-34s %7d ", 594 substr("\"".$title_xlate_table->{$xlate_to}->{translation}."\"",0,34), 595 $title_xlate_table->{$xlate_to}->{translated}; 596 597 foreach my $source (sort { $title_xlate_table->{$xlate_to}->{same}->{$b} <=> $title_xlate_table->{$xlate_to}->{same}->{$a} } 598 keys %{($title_xlate_table->{$xlate_to}->{same})}) { 599 printf ALT_TITLE_FILE " %s(%d)", $source, $title_xlate_table->{$xlate_to}->{same}->{$source}; 600 } 601 printf ALT_TITLE_FILE "\n"; 602 603 foreach my $xlate_from (sort keys %{($title_xlate_table->{$xlate_to}->{alternate})}) { 604 my $last_xlated = (time - $title_xlate_table->{$xlate_to}->{alternate}->{$xlate_from}->{last_seen_in_secondary}); 605 my $last_xlated_desc; 606 if ($last_xlated < (24*60*60)) { 607 $last_xlated_desc = sprintf "-%dhrs",int($last_xlated/(24*60*60)); 608 } elsif ($last_xlated < (7*24*60*60)) { 609 $last_xlated_desc = sprintf "-%ddays",int($last_xlated/(24*60*60)); 610 } else { 611 $last_xlated_desc = sprintf "-%dwks",int($last_xlated/(7*24*60*60)); 612 } 613 614 printf ALT_TITLE_FILE "-%-34s %7s ",substr("\"".$xlate_from."\"",0,34),$last_xlated_desc; 615 616 foreach my $source (sort { $title_xlate_table->{$xlate_to}->{alternate}->{$xlate_from}->{secondary}->{$a} <=> 617 $title_xlate_table->{$xlate_to}->{alternate}->{$xlate_from}->{secondary}->{$b} } 618 keys %{($title_xlate_table->{$xlate_to}->{alternate}->{$xlate_from}->{secondary})}) { 619 printf ALT_TITLE_FILE " %s(%d)", $source, $title_xlate_table->{$xlate_to}->{alternate}->{$xlate_from}->{secondary}->{$source}; 620 } 621 printf ALT_TITLE_FILE "\n"; 622 } 623 printf ALT_TITLE_FILE "\n"; 584 624 } 585 625 … … 1064 1104 1065 1105 ###################################################################################################### 1106 # all logic associated with choosing the preferred title of a programme 1107 # (uses past-seen choices to set preferences) 1108 1109 sub choose_title 1110 { 1111 my ($num_matching,$m) = @_; 1112 my @titles, my @titles_from; 1113 my $num_titles = 0; 1114 1115 # 1. gather a list of all titles we have for our preferred language 1116 # there are stored in the @titles array in our "preferred grabber" order 1117 for my $i (0..($num_matching-1)) { 1118 if (defined $m->[$i]->{title}) { 1119 foreach my $found_t (@{($m->[$i]->{title})}) { 1120 my $t = $found_t->[0]; 1121 my $l = $found_t->[1]; 1122 1123 if ((!defined $l) || (lc($l) eq lc($opt->{lang}))) { 1124 $titles[$num_titles] = $t; 1125 $titles_from[$num_titles] = $m->[$i]->{grabber}; 1126 $num_titles++; 1127 } 1128 } 1129 } 1130 } 1131 1132 # 2. no titles in our language? return with the first title we saw 1133 if ($num_titles == 0) { 1134 my $title = $m->[0]->{title}->[0]->[0]; 1135 my $lang = $m->[0]->{title}->[0]->[1]; 1136 1137 &log($reclogic{debug_choose_title},(sprintf 1138 "choose_title: no titles in lang %s found; using first title \"%s\" in lang %s", 1139 $opt->{lang}, $title, (defined $lang ? $lang : "(undef)"))); 1140 return ($title, $lang); 1141 } 1142 1143 # 3. do we already have any titles in our list here in our 'preferred title' list? 1144 my $found_index = -1; 1145 foreach my $i (0..$num_titles) { 1146 if (defined $title_xlate_table->{(lc($titles[$i]))}) { 1147 $found_index = $i; 1148 last; 1149 } 1150 } 1151 1152 # 4. found our preferred title. use that. 1153 if ($found_index != -1) { 1154 my $key = lc($titles[$found_index]); 1155 my $title = $title_xlate_table->{$key}->{translation}; 1156 1157 &log($reclogic{debug_choose_title},(sprintf 1158 "choose_title: existing preferred title \"%s\" matched with title \"%s\" from grabber %s (index %d)", 1159 $title, $titles[$found_index], $titles_from[$found_index], $found_index)); 1160 1161 # update stats on use 1162 $title_xlate_table->{$key}->{seen_in_primary}++; 1163 $title_xlate_table->{$key}->{last_seen_in_primary} = time; 1164 1165 # update 'seen' stats for alternatives 1166 foreach my $i (0..($num_titles-1)) { 1167 my $key2 = $titles[$i]; # don't actually store in lower-case.. 1168 my $source = $titles_from[$i]; 1169 1170 if (lc($key) eq lc($key2)) { 1171 # store where we have seen the same title 1172 $title_xlate_table->{$key}->{same}->{$source}++; 1173 } else { 1174 # store all alternatives for this title 1175 $title_xlate_table->{$key}->{alternate}->{$key2}->{secondary}->{$source}++; 1176 $title_xlate_table->{$key}->{alternate}->{$key2}->{last_seen_in_secondary} = time; 1177 } 1178 } 1179 1180 return ($title, $opt->{lang}); 1181 } 1182 1183 # 5. didn't find this title in our preferred title list. 1184 # see if it is an alternate name 1185 foreach my $i (0..($num_titles-1)) { 1186 my $title = $titles[$i]; # don't actually convert to lowercase.. 1187 1188 # FUTURE MAYBE: this is a linear search. 1189 # if it grows too much consider a schema change to make it better 1190 1191 foreach my $key (keys %{($title_xlate_table)}) { 1192 foreach my $key2 (keys %{($title_xlate_table->{$key}->{alternate})}) { 1193 if (lc($key2) eq lc($title)) { 1194 # matched alternate! 1195 $title_xlate_table->{$key}->{translated}++; 1196 my $xlated_to = $title_xlate_table->{$key}->{translation}; 1197 my $xlated_from = $titles[$i]; 1198 $in->{used_translations}->{$xlated_to}->{num}++; 1199 $in->{used_translations}->{$xlated_to}->{from}->{$xlated_from}++; 1200 1201 &log($reclogic{debug_choose_title},(sprintf 1202 "choose_title: title \"%s\" (idx %d grabber %s) matched previously-seen alternate title for \"%s\"", 1203 $xlated_from, $i, $titles_from[$i], $xlated_to)); 1204 1205 # update 'seen' stats for alternatives 1206 foreach my $j (0..($num_titles-1)) { 1207 my $key2a = $titles[$j]; # don't store in lowercase 1208 my $source = $titles_from[$j]; 1209 1210 if ($key eq lc($key2a)) { 1211 # store where we have seen the same title 1212 $title_xlate_table->{$key}->{same}->{$source}++; 1213 } else { 1214 # store all alternatives for this title 1215 $title_xlate_table->{$key}->{alternate}->{$key2a}->{secondary}->{$source}++; 1216 $title_xlate_table->{$key}->{alternate}->{$key2a}->{last_seen_in_secondary} = time; 1217 } 1218 } 1219 1220 # return primary translation for this found alternative 1221 return ($xlated_to, $opt->{lang}); 1222 } 1223 } 1224 } 1225 } 1226 1227 my $preferred_title = $titles[0]; 1228 1229 # 6. don't create a preferred title for this unless we have met our threshold for title_xlate_table_min_alt_progs 1230 if (($num_titles-1) < $reclogic{title_xlate_table_min_alt_progs}) { 1231 &log($reclogic{debug_choose_title},(sprintf 1232 "choose_title: title \"%s\" not added as a preferred title due to title_xlate_table_min_alt_progs (%d)", 1233 $preferred_title, $reclogic{title_xlate_table_min_alt_progs})); 1234 return ($preferred_title, $opt->{lang}); 1235 } 1236 1237 # 7. wasn't an alternate name 1238 # add it as a preferred name 1239 1240 my $key = lc($preferred_title); 1241 $title_xlate_table->{$key}->{seen_in_primary} = 1; 1242 $title_xlate_table->{$key}->{last_seen_in_primary} = time; 1243 $title_xlate_table->{$key}->{translated} = 0; 1244 $title_xlate_table->{$key}->{translation} = $preferred_title; 1245 $title_xlate_table->{$key}->{same}->{$titles_from[0]} = 1; 1246 1247 foreach my $i (1..($num_titles-1)) { 1248 my $key2 = $titles[$i]; 1249 my $source = $titles_from[$i]; 1250 1251 if (lc($key2) eq $key) { 1252 $title_xlate_table->{$key}->{same}->{$source}++; 1253 } else { 1254 $title_xlate_table->{$key}->{alternate}->{$key2}->{secondary}->{$source} = 1; 1255 $title_xlate_table->{$key}->{alternate}->{$key2}->{last_seen_in_secondary} = time; 1256 } 1257 } 1258 1259 &log($reclogic{debug_choose_title},(sprintf 1260 "choose_title: added title \"%s\" as a preferred title (grabber %s)", 1261 $preferred_title, $titles_from[0])); 1262 1263 return ($preferred_title, $opt->{lang}); 1264 } 1265 1266 ###################################################################################################### 1066 1267 # insert a programme into our reconciled list 1067 1268 # - if fed multiple programmes for the one slot, choose attributes from all of them … … 1069 1270 sub add_one_programme 1070 1271 { 1071 my($chan_id,$ num_matching,$m) = @_;1272 my($chan_id,$title,$title_lang,$num_matching,$m) = @_; 1072 1273 &log($reclogic{debug_add_logic}, 1073 1274 (sprintf "add_one_programme: adding programme %s-%s \"%s\" with data from %d programmes", 1074 1275 (strftime "%a%e%b%H:%M",localtime(($m->[0]->{start_epoch}))), 1075 1276 (strftime "%a%e%b%H:%M",localtime(($m->[0]->{stop_epoch}))), 1076 $ m->[0]->{title}->[0]->[0], $num_matching));1277 $title, $num_matching)); 1077 1278 1078 1279 my $newprog; 1079 1280 my $chan = $m->[0]->{channel}; 1080 1281 my $starttime = $m->[0]->{start_epoch}; 1282 my $have_xlated_title = 0; 1081 1283 1082 1284 # always take start/stop/channel from first choice … … 1092 1294 $newprog->{stop_epoch} = $m->[0]->{stop_epoch}; 1093 1295 $newprog->{channel} = $chan; 1296 $newprog->{title}->[0] = [ $title, $title_lang ]; 1094 1297 1095 1298 $newprog->{datasources} = ""; … … 1099 1302 # (1) merge in attributes which are simple scalars 1100 1303 foreach my $field ('date', 'length') { 1101 $newprog->{$field} = $m->[$i]->{$field} 1102 if ((!defined $newprog->{$field}) && (defined $m->[$i]->{$field}) && ($m->[$i]->{$field} ne "")); 1304 if ((!defined $newprog->{$field}) && 1305 (defined $m->[$i]->{$field}) && 1306 ($m->[$i]->{$field} ne "")) { 1307 $newprog->{$field} = $m->[$i]->{$field}; 1308 &log($reclogic{debug_add_logic}, 1309 (sprintf " - added field %s from #%d (%s) value %s", 1310 $field,$m->[$i]->{grabber_num},$m->[$i]->{grabber},$newprog->{$field})); 1311 } 1103 1312 } 1104 1313 … … 1124 1333 $newprog->{$field}->[$num_existing] = $entry; 1125 1334 $num_existing++; 1335 1336 &log($reclogic{debug_add_logic}, 1337 (sprintf " - added field %s from #%d (%s) value %s", 1338 $field,$m->[$i]->{grabber_num},$m->[$i]->{grabber},$entry)); 1126 1339 } 1127 1340 } … … 1130 1343 1131 1344 # (3) merge in attributes which are [val,lang] pairs, [val,val] or [val,val,val] 1345 # note: while 'title' is here, this is simply to pick up titles in any 1346 # additional languages; the primary (preferred) title has already been 1347 # set via the choose_title() routine 1132 1348 foreach my $field ('title', 'sub-title', 'desc', 'category', 'country', 'episode-num', 'rating') { 1133 1349 my $num_added = 0; … … 1164 1380 $lang_added{$lang} = $val; 1165 1381 1166 # title is special - we write out alternate title if we have one1167 if (($field eq "title") && ($lang eq $opt->{lang})) {1168 if (defined $title_map_table->{$val}) {1169 # got a translation to make!1170 # if we have multiple to choose from, choose the one1171 # used the most1172 1173 my $translations = $title_map_table->{$val};1174 my @translation_list = sort { choose_best_translation($val,$a,$b) } keys %{$translations};1175 my $chosen_xlate = $translation_list[0];1176 1177 if (lc($chosen_xlate) ne lc($val)) {1178 $title_map_table->{$val}->{$chosen_xlate}->{times_translated}++;1179 $title_map_table->{$val}->{$chosen_xlate}->{last_translated} = time;1180 $in->{used_translations}->{$chosen_xlate}->{from}->{$val}++;1181 $in->{used_translations}->{$chosen_xlate}->{num}++;1182 1183 &log($reclogic{debug_add_logic_name_xlate},1184 (sprintf "add_one_programme: chose translation '%s' for title '%s'",1185 $chosen_xlate, $val));1186 1187 $val = $chosen_xlate;1188 $stats{used_translated_title}++;1189 }1190 }1191 }1192 1382 $newprog->{$field}->[$num_added]->[0] = $val; 1383 1384 &log($reclogic{debug_add_logic}, 1385 (sprintf " - added field %s(%s) from #%d (%s) value %s", 1386 $field,($lang ne "BLANK" ? $lang : ""),$m->[$i]->{grabber_num},$m->[$i]->{grabber},$val)); 1193 1387 1194 1388 if ($lang eq "BLANK") { … … 1231 1425 $entries{$entry} = 1; 1232 1426 $num_added++; 1427 1428 &log($reclogic{debug_add_logic}, 1429 (sprintf " - added field %s/%s from #%d (%s) value %s", 1430 $field,$field2,$m->[$i]->{grabber_num},$m->[$i]->{grabber},$entry)); 1233 1431 } 1234 1432 } … … 1241 1439 if ((!defined $newprog->{$field}) && (defined $m->[$i]->{$field})) { 1242 1440 $newprog->{$field} = $m->[$i]->{$field}; 1441 1442 &log($reclogic{debug_add_logic}, 1443 (sprintf " - added field %s from #%d (%s)", 1444 $field,$m->[$i]->{grabber_num},$m->[$i]->{grabber})); 1243 1445 } 1244 1446 } … … 1263 1465 $newprog->{$field}->{$entry} = $m->[$i]->{$field}->{$entry}; 1264 1466 $entries{$entry} = $m->[$i]->{$field}->{$entry}; 1467 1468 &log($reclogic{debug_add_logic}, 1469 (sprintf " - added field %s from #%d (%s) value %s", 1470 $field,$m->[$i]->{grabber_num},$m->[$i]->{grabber},$entries{$entry})); 1265 1471 } 1266 1472 } … … 1279 1485 $in->{total_progs_out}->{($newprog->{channel})}++; 1280 1486 } 1281 }1282 1283 ######################################################################################################1284 # logic for choosing the best translation1285 # called from sort of $title_map_table->{}1286 1287 # choose "most translated"1288 # if zero, then choose "most seen"1289 1290 sub choose_best_translation1291 {1292 my ($v,$a,$b) = @_;1293 my $most_translated_result = ($title_map_table->{$v}->{$b}->{times_translated} <=> $title_map_table->{$v}->{$a}->{times_translated});1294 return $most_translated_result if ($most_translated_result != 0);1295 return ($title_map_table->{$v}->{$b}->{times_seen} <=> $title_map_table->{$v}->{$a}->{times_seen});1296 1487 } 1297 1488 … … 1573 1764 $this_title, $i, $matching_progs->[$num_matching_progs]->{grabber})); 1574 1765 1575 # store details of this in our mappings table if titles differ1576 if (lc($primary_title) ne lc($this_title)) {1577 if ($title_map_table->{$this_title}->{$primary_title}->{times_seen}) {1578 $stats{already_seen_title_translations}++;1579 } else {1580 $stats{added_title_translation}++;1581 $title_map_table->{$this_title}->{$primary_title}->{times_translated} = 0;1582 $title_map_table->{$this_title}->{$primary_title}->{times_seen} = 0;1583 &log($reclogic{debug_find_prog_to_add},1584 (sprintf "find_prog_to_add: - saving title translation: preferred \"%s\", alternate \"%s\"",1585 $primary_title, $this_title));1586 }1587 $title_map_table->{$this_title}->{$primary_title}->{times_seen}++;1588 $title_map_table->{$this_title}->{$primary_title}->{last_seen} = time;1589 }1590 1591 1766 $num_matching_progs++; 1592 1767 } 1593 1768 } 1594 1769 } 1595 &add_one_programme($chan_id,$num_matching_progs,$matching_progs); 1770 1771 my ($title, $title_lang) = &choose_title($num_matching_progs,$matching_progs); 1772 &add_one_programme($chan_id,$title,$title_lang,$num_matching_progs,$matching_progs); 1596 1773 1597 1774 # remove all programming data for this channel which overlaps with this (inserted) programme -
status
r103 r105 7 7 grabber:jrobbo:0.03-r4 8 8 grabber:d1:0.6.2.3-r4 9 reconciler:reconciler_mk2:0.0 79 reconciler:reconciler_mk2:0.08 10 10 postprocessor:imdb_augment_data:0.03
