You can use this program to export Last.FM playback history to anything. Just run it, supply with your account name and offset page number (or skip this one if you want an export of your entire library).
Add your functionality around lines 114-115 to either write a text file or CSV or push to the database, it's your call really. You are welcome to use it anywhere you want.
Courtesy of Largest Music Library Ever.
package com.aulismedia.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LastFMExport {
public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
String account = "";
int startPage = 1;
if (args==null || args.length==0) { account = "davidusher"; } // whatever ;-)
if (args.length>0) { account = args[0]; }
if (args.length>1) { startPage = Integer.parseInt( args[1] ); }
( new LastFMExport() ).processAccount(account, startPage);
}
public void processAccount(String accountName, int startPage) {
String operatingHTML = "";
try {
operatingHTML = getURLContents("http://www.last.fm/user/"; + accountName + "/tracks");
} catch (Exception e2) {
System.out.println( "Could not load initial page." );
System.exit(1);
}
int numberOfPages = 0;
String prefix = "class=\"lastpage\">";
String postfix = "</a>";
Pattern patternNumber = Pattern.compile( prefix + "(\\d+)" + postfix);
Matcher myMatcher = patternNumber.matcher(operatingHTML);
if (!myMatcher.find()) {
System.out.println( "Could not get number of pages" );
System.exit(1);
}
numberOfPages = Integer.parseInt( myMatcher.group().substring(prefix.length(), myMatcher.group().length()-postfix.length()) );
for (int i=1; i<=numberOfPages; i++) {
try {
operatingHTML = getURLContents("http://www.last.fm/user/"; + accountName + "/tracks?page=" + i);
} catch (Exception e1) {
System.out.println( "Page " + i + " could not be loaded." );
System.exit(1);
}
while (operatingHTML.indexOf("<td class=\"subjectCell\">")>-1) {
operatingHTML = operatingHTML.substring( operatingHTML.indexOf("<td class=\"subjectCell\">")+1 );
Pattern valueFinder = Pattern.compile("<a[^>]*>(.*?)</a>");
Matcher regexMatcher = valueFinder.matcher(operatingHTML);
String artistName = null;
String trackTitle = null;
String timeStamp = null;
Date date = null;
int counter = 0;
while(regexMatcher.find() && counter<2) {
String matchedString = regexMatcher.group().substring(regexMatcher.group().indexOf(">")+1 , regexMatcher.group().lastIndexOf("<"));
matchedString = matchedString.replace("&", "&");
if (counter==0) artistName = matchedString;
if (counter==1) trackTitle = matchedString;
counter++;
}
Pattern abbrFinder = Pattern.compile("<abbr[^>]*>(.*?)</abbr>");
Matcher abbrRegexMatcher = abbrFinder.matcher(operatingHTML);
if (abbrRegexMatcher.find()) {
timeStamp = abbrRegexMatcher.group().substring( abbrRegexMatcher.group().indexOf("\"")+1, abbrRegexMatcher.group().lastIndexOf("\"") );
timeStamp = timeStamp.replace("T", " ").replace("Z", "");
try {
date = sdf.parse(timeStamp);
} catch (ParseException e) {
System.out.println( "This should not happen - date parser exception" );
System.exit(1);
}
}
String report = String.format("Imported: %s - %s @ %s", artistName, trackTitle, date.toString());
System.out.println( report );
// here you can do whatever you wish with this data:
// artistName, trackTitle and date
}
System.out.println( "Finished page " + i);
System.out.println( "" );
}
}
public static String getURLContents(String urlString) throws Exception {
StringBuffer results = new StringBuffer();
InputStream is = null;
try {
URL url = new URL(urlString);
URLConnection urlc = url.openConnection();
urlc.setRequestProperty("User-Agent", "Mozilla 5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) ");
urlc.setRequestProperty("Content-Type", "text/html; charset=UTF-8" );
urlc.setConnectTimeout(5000);
urlc.setReadTimeout(5000);
is = urlc.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
results.append(line).append("\n");
}
} catch (Exception E) {
// E.printStackTrace();
}
finally { if (is != null) is.close(); }
return results.toString();
}
}
This is it
В Приморье исчезло озеро, на котором цвели редкие лотосы, занесенные в Красную книгу
2011-10-13 15:35:32Озеро «Соленая Падь», на котором цвели редкие, занесенные в Красную книгу России, лотосы, исчезло в городе Лучегорск Пожарского района Приморья, сообщили сегодня корр. ИТАР-ТАСС в управлении Росприроднадзора региона.
В настоящее время сотрудники ведомства ведут сбор информации об этом инциденте. К проверке подключилась сегодня и краевая природоохранная прокуратура.
«Соленая Падь» давно стала не только излюбленным местом отдыха жителей Лучегорска, но и обитания целого ряда редких видов моллюсков и рыбы. Летом на озере цвели занесенные в Красную книгу России лотосы Комарова.
В мае 2007 года озеро было выставлено на продажу и уже через несколько месяцев у него появился новый хозяин — частный предприниматель из города Арсеньева. Он резко ограничил посещение озера жителями и рыбаками.
Первые признаки беды появились в прошлом году, когда экологи обнаружили, что в озере погибли моллюски и рыба, а уровень воды резко понизился. Ученые забили тревогу. В декабре 2010 года Арбитражный суд края признал право собственности государства на «Соленую падь». Прежнего же хозяина отыскать так и не удалось: по некоторым сведениям, он покинул страну.
Обмеление озера в этом году остановить не удалось. Сегодня на его месте — пустой котлован, заросший полынью. От одного из красивейших мест Приморья остались только фотографии и воспоминания приморцев.
«В настоящее время ведомство намерено обратиться во все инстанции, чтобы начать судебный процесс над виновными в ЧП»,- отметили в управлении Росприроднадзора.
Взято отсюдаВечный огонь
2011-10-11 18:01:53who is jobs galt
2011-10-10 22:04:03Не хотел ничего писать по поводу сегодняшнего, но, слушайте, Джобс, которого вы хороните — это какой-то другой Джобс, не тот, которого знаю по его выступлениям и поступкам (разумеется, могу и сам знать неправильно). Со словами вроде «визионер, изменивший мир» не поспорить, но они говорят далеко не все, и в числе опущенного оказывается очень важное. Под это описание подходит и Дисней — а Джобс совершенно не был таким же вечно улыбающимся филантропом, и, думаю, сам не хотел бы, чтобы его так представляли.
Джобс поступал и высказывался эгоистично и жестко. Он был одним из немногих миллиардеров, не занимавшихся благотворительностью. Ему было наплевать на разработчиков, программы которых внезапно удаляли из App Store по непонятным причинам, лишая их денег. Ему было наплевать на чувства громадной части человечества, желающей купить продукцию Apple и не имеющей возможности. Ему было наплевать на неудобства, испытываемые пользователями из-за отсутствия флэша на iPad. Он крайне остро (и в части случаев незаслуженно) прохаживался по конкурентам. Он так же жестко критиковал собственных сотрудников, когда что-то получалось не так.
И при этом величие Джобса во многом состоит в том, что он своей жизнью лучше всех в мире подтверждал айн-рэндовский тезис «эгоисты, если им не мешать, сделают лучше не только себе, но и другим». Он заламывал цены — но для возможности это делать выпускал продукты, за которые люди не просто готовы были платить втридорога, а еще и оказывались при этом счастливыми. Он бескомпромиссно отказывался от не нравящихся ему технологий вроде флэша, причиняя тем самым неудобства людям — но в результате для флэш-сайтов это стало поводом перейти на более прогрессивный HTML5. Он нанимал людей в собственных целях, а не ради блага самих людей — но в итоге предоставлял 50 000 отличных рабочих мест. Наконец, он, не давая другим деньги, подавал им пример — что в конечном счете могло принести им больше пользы.
Жесткость к другим сочеталась с такой же жесткостью к себе, без которой вряд ли что-то получилось бы; Джобс не был слепым тираном и не мнил себя богом, а сам работал на износ до последнего. Его уход на больничный был привязан к оглашению отличных квартальных результатов, чтобы падение акций быстро компенсировалось подъемом. Дата ухода с поста главы Apple тоже не выглядит случайной (хотя и может быть такой): перед этим компания впервые стала самой дорогой в мире, стало можно уходить спокойнее. Символичной выглядит даже сегодняшняя дата; если вдруг в чьих-нибудь мемуарах мы прочитаем, что Джобс умер чуть раньше, перед этим попросив придержать сообщение о смерти, чтобы не портить презентацию iPhone 4S, готов буду поверить.
О неизбежности своей смерти он отлично помнил и прямо говорил в своей самой известной речи (забавное совпадение: если набрать в Google «речь дж», двумя первыми вариантами автодополнения будут «речь джобса» и «речь джона галта»), что ее осознание помогает ему принимать правильные решения — а также что смерть старого нужна, чтобы расчистить путь новому, и нужно желать не вечной жизни, а наиболее полной жизни здесь и сейчас.
Поэтому подозреваю, что многое из написанного сегодня о нем и его смерти Джобс назвал бы соплями.
Взято отсюда