Faits : A. C._ SA et D._ étaient locataires d'une arcade et d'un dépôt destinés à l'exploitation d'un café-bar, situés à Genève. La bailleresse était alors la SI E._, dont les actifs et les passifs seront repris ensuite par D._ AG. Les baux avaient été conclus pour une durée fixe de dix ans à partir du 1er novembre 2001 et venaient à échéance sans résiliation le 31 octobre 2011. Les locataires avaient le droit de prolonger les baux une fois pour une durée de cinq ans jusqu'au 31 octobre 2016; l'option s'éteignait en cas de sous-location ou de cession des baux. Les loyers annuels s'élevaient à 16'380 fr. et 2'400 fr. Par contrat du 4 mars 2005, les locataires ont vendu le fonds de commerce, incluant l'enseigne, le mobilier, le matériel d'exploitation et la clientèle, pour 50'000 fr. à A._, née en 1956. Ils ont en outre sollicité le transfert des baux en faveur de A._ ou la conclusion de nouveaux contrats avec cette dernière. Par contrat du 21 avril 2005 conclu entre la bailleresse, les locataires et A._, les baux ont été transférés à cette dernière; il y était précisé que les baux signés le 20 septembre 2001 pour une durée de dix ans se terminaient le 1er octobre 2001 (sic). B. Le 31 août 2011, A._ a déposé une requête auprès de la Commission de conciliation en matière de baux et loyers, concluant principalement à ce qu'il soit constaté que les baux étaient de durée indéterminée, subsidiairement à ce qu'une prolongation de six ans lui soit accordée avec autorisation à se départir des contrats en tout temps moyennant un préavis de trente jours. Par pli du 1er novembre 2011, la bailleresse a rappelé à la locataire que les baux avaient pris fin et que tout versement de sa part serait considéré comme indemnité pour occupation illégale. La cause a été déclarée non conciliée le 16 novembre 2012. Le 21 novembre 2012, A._ a saisi le Tribunal des baux et loyers du canton de Genève. Par jugement du 17 mars 2014, le tribunal a constaté que les baux étaient de durée déterminée et qu'ils étaient arrivés à échéance le 31 octobre 2011; il a accordé une unique prolongation de trois ans, la locataire étant autorisée à résilier les baux en tout temps moyennant un préavis de trente jours. La locataire a interjeté appel. En cours de procédure, les actifs et passifs de la société bailleresse ont été repris par B._ AG. Par arrêt du 26 janvier 2015, la Chambre des baux et loyers de la Cour de justice du canton de Genève a confirmé l'échéance des baux au 31 octobre 2011. Elle a réformé le jugement de première instance en ce sens qu'une prolongation unique de trois ans et demi, échéant le 30 avril 2015, était accordée à la locataire. C. A._ interjette un recours en matière civile, concluant à une unique prolongation de bail de six ans échéant au 31 octobre 2017. B._ AG propose le rejet du recours en tant qu'il est recevable. Les parties ont chacune déposé une seconde écriture. Par ordonnance du 20 mai 2015, la Présidente de la cour de céans a accordé l'effet suspensif requis par la recourante.