User:Tokfo/bahnbilderparser.java

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
/*

Im Interesse der Transparenz und Nachhaltigkeit veröffentliche ich hier das
Java-Programm, mit dem ich Bilder von bahnbilder.de auf Commons übertrage. Es
ist über die Kommandozeile zu benutzen, etwa so (der Dateiname muss
bahnbilderparser.java bzw. kompiliert bahnbilderparser.class sein):
$ java bahnbilderparser http://www.bahnbilder.de/name/galerie/fotograf/21073/username/kurt-rasmussen.html

Tipp: Es gibt auf bahnbilder.de URLs, die etwa auf /digitalfotografie/24.html
enden (wenn man auf weitere Seiten einer solchen Ergebnisseite geht). In der
letzten Komponente einer solchen URL funktioniert jede Zahl, nicht nur die,
die man über die Oberfläche erreichen kann; nützlich, um bei einem beliebigen
Bild zu beginnen bzw. nach einem Absturz weiterzumachen (zu diesem Zwecke gibt
dieses Programm die Anzahl der hochgeladenen Bilder auf der Konsole aus).

Dieses Programm ist unter CC0 lizenziert.
(https://creativecommons.org/publicdomain/zero/1.0/deed)
Es wird ohne irgendeine Gewährleistung angeboten und es wird darauf hingewiesen,
dass hier sehr viel fest einprogrammiert ist, das definitiv geändert werden
muss, wenn jemand anderer es verwendet (etwa der Benutzername).

Abhängigkeiten:
- JSOUP: http://jsoup.org/
- wiki.java: https://code.google.com/p/wiki-java/

---

In the interest of transparency and sustainability I'm publishing here the
Java program I use to transfer images from bahnbilder.de to Commons. It is
meant for command line use, like this (the filename must be
bahnbilderparser.java or, in compiled form, bahnbilderparser.class):
$ java bahnbilderparser http://www.bahnbilder.de/name/galerie/fotograf/21073/username/kurt-rasmussen.html

Hint: On bahnbilder.de there are URLs that end like /digitalfotografie/24.html
(if you go to another page than the first). The last component accepts any
number, not just those reachable via the interface; this is useful e.g. to
start the transfer at an arbitrary image or continue after a crash (for that
purpose the program outputs the number of uploaded images on the console).

This program is licensed under CC0.
(https://creativecommons.org/publicdomain/zero/1.0/deed)
It is provided without any warranty and it is noted that a lot is hardcoded
here that must definitely be changed if someone else uses it (e.g. username).

Dependencies:
- JSOUP: http://jsoup.org/
- wiki.java: https://code.google.com/p/wiki-java/

---

En la intereso de travidebleco kaj daŭripoveco mi publikigas jen la Java-
programon, per kiu mi transmetas bildojn de bahnbilder.de al la Komunejo. Ĝi
uzeblas per la komandlinio tiel ĉi (la dosiernomo devas esti
bahnbilderparser.java aŭ bahnbilderparser.class en tradukita formo):
$ java bahnbilderparser http://www.bahnbilder.de/name/galerie/fotograf/21073/username/kurt-rasmussen.html

Konsilo: En bahnbilder.de estas retadresoj finiĝantaj kiel
/digitalfotografie/24.html (se oni iras al alia paĝo ol la unua). La lasta
parto akceptas ĉiun ajn nombron, ne nur tiujn atingeblajn per la interfaco; tio
utilas ekz. por komenci la transmeton ĉe ajna bildo aŭ por daŭrigi post kraŝo
(tiucele la programo eldonas la nombron da alŝutitaj bildoj en la konsolo).

Tiu ĉi programo estas licencita per CC0.
(https://creativecommons.org/publicdomain/zero/1.0/deed)
Ĝi estas provizita sen ajna garantio kaj estas atentigate pri tio, ke multo
estas fiksprogramita tie ĉi, kio devas nepre esti ŝanĝata, se iu alia uzas ĝin
(ekz. la uzantnomo).

Dependaĵoj:
- JSOUP: http://jsoup.org/
- wiki.java: https://code.google.com/p/wiki-java/

*/

import org.jsoup.*;
import org.jsoup.select.*;
import org.jsoup.nodes.*;
import java.io.*;
import org.wikipedia.*;
import javax.security.auth.login.*;
import java.util.regex.*;

public class bahnbilderparser
{
	static String password;
	static Wiki commons;
	public static void main(String[] args) throws IOException, FailedLoginException, LoginException
	{
		String url = args[0];
		Document doc = Jsoup.connect(url).get();
		Elements prevs = doc.getElementsByClass("bildvorschau");
		Console c = System.console();
		password = new String(c.readPassword("password: "));
		commons = Wiki.createInstance("commons.wikimedia.org");
        commons.setUsingCompressedRequests(false);
		commons.login("Tokfo", password);
		int i=0;

		for(Element v: prevs)
		{
		
			String attrhref = v.child(0).attr("href");
			if(v.child(0).attr("class").equals("werbekasten"))
			{
				attrhref = v.child(1).attr("href");
			}
			getImage(attrhref);
			i++;
			System.out.println(i+"");
		}
	}

	public static void getImage(String url) throws IOException, FailedLoginException, LoginException
	{
		Document doc = Jsoup.connect(url).get();
		String desc = doc.getElementsByClass("beschreibung").get(0).html();
		String imgurl = doc.getElementById("hauptbild").attr("src");
		String geotag = "{{location possible}}";
		String finalDesc = "";
		String datetime = retrieveDate(doc);
		
		Elements latlons = doc.getElementById("weiterebilderaccordion")
			.getElementsByAttributeValueStarting("href", "##");
		String splitString = "##";
		if(latlons.isEmpty())
		{
			latlons = doc.getElementById("weiterebilderaccordion")
				.getElementsByAttributeValueMatching("href", Pattern.compile("/name/galerie/geo/.*#\\d.*"));
			splitString = "#";
		}
		if(!latlons.isEmpty())
		{
			Element latlon = latlons.get(0);
			String lon = latlon.attr("href").split(splitString)[1].split(",")[0];
			String lat = latlon.attr("href").split(splitString)[1].split(",")[1];
			geotag = "{{location dec|" + lat + "|" + lon + "}}";
		}
	
		finalDesc = "{{Information\n|Description={{de|1=" + desc + "}}\n|Source=" + url + "\n|Date=" + datetime + "\n|Author=[http:/" + "/www.bahnbilder.de/name/profil/fotograf_id/21073.html Kurt Rasmussen]\n|Permission={{Kurt Rasmussen permission}}\n|other_versions=\n}}\n" + geotag + "\n\n[[Category:Files uploaded by Tokfo (cleanup)]]";

		upload("http://www.bahnbilder.de" + imgurl, finalDesc, desc);

	}

	public static String retrieveDate(Document doc)
	{
		Elements bildcontainers = doc.getElementsByClass("bildcontainer");
		if(bildcontainers.isEmpty())
		{
			return "";
		}
		Element bildcontainer = bildcontainers.get(0);
		Elements grau = bildcontainers.select("p.grau");
		if(grau.isEmpty())
		{
			return "";
		}
		for(Element g: grau)
		{
			if(g.html().indexOf("EXIF:") != -1)
			{
				String[] gsplit1 = g.html().split("Datum ");
				if(gsplit1.length < 2)
				{
					return "";
				}
				String[] gsplit2 = gsplit1[1].split(",");
				String[] datetime = gsplit2[0].split(" ");
				return datetime[0].replace(':', '-') + " " + datetime[1];
			}
		}
		return "";
	}


	public static void upload(String url, String finalDesc, String desc) throws IOException, FailedLoginException, LoginException
	{
		System.out.println("uploading:");
		System.out.println(url);
		System.out.println(finalDesc);

		// save file
		Connection.Response resp = Jsoup.connect(url).ignoreContentType(true).execute();
		FileOutputStream out = new FileOutputStream(new File("file.jpg"));
		out.write(resp.bodyAsBytes());
		out.close();

		// upload file
		String[] urlsplit = url.split("/");
		String filename = urlsplit[urlsplit.length-1];
		filename = filename.substring(0,1).toUpperCase() + filename.substring(1);
		commons.upload(new File("file.jpg"), filename, finalDesc, url + " – " + desc);
	}

}