Java Link in einer Gui eingeben/Bild downloaden/Verzeichnis wählen?

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.718
Hey Community,

Ich möchte mir mein leben etwas vereinfachen und mir eine GUI schreiben, in der ich Links sammeln kann und diese downloadet mir dann die Bilddateien. Es handelt sich ausschließlich um direkte Links zu einer Bilddatei!
Wie kann ich aber diese Bilder downloaden/speichern und wie wähle programmiere ich einen Button, mit dem man sagen kann, ich möchte die Datei da speichern?

Ich würde das ganze erstmal gerne Konsolenbasiert umsetzten und mich danach an eine GUI machen.
 
Ja, tut mir leid.

Aber ich programmiere in der Schule und das schon seit einem Jahr.
Jetzt sogar im Leistungskurs. Beherrsche schon Objektorientiert und alles was dazu gehört.
Fangen jetzt mit Sortieralgorhytmen an. Hatten wir aber schon mal kurz in dem Jahr davor.
Ergänzung ()

Jetzt mal was zum Code, denn ich schreiben möchte.
Wird wohl doch nicht so einfach, wie ich dachte.

Ich lade manchmal Musik von Soundcloud herunter und die haben auch immer schön zu jedem Song ein Cover :)

Ich wollte jetzt ein Programm schreiben, welches mir das Cover speichert, wenn ich den Link eingebe.
Sonst muss ich immer über F12 - Element Untersuchen um die JPG Datei zu bekommen gehen, das nervt nach einer Zeit.

Hat jemand eine Idee, wie ich das Umsetzten kann?
Jedes Lied muss ja eine eindeutige ID haben, womit man auch das Cover finden müsste...
 
Zuletzt bearbeitet:
ich kann mit firefox auf soundcloud einfach rechtsklick auf das cover machen -> hintergrundgrafik anzeigen. dann ganz normal speichern unter.

Falls du dafür ein Programm erstellen willst:

Soundcloud hat Meta Tags, in denen zb Tracktitel und Cover url stehen.
am bsp deines link:
og:url - https://soundcloud.com/ivoryoasis/kiso-hvar-ft-msp
og:title - Kiso - Hvar ft. MSP
og:image - https://i1.sndcdn.com/artworks-000133471105-tiei06-t500x500.jpg
og:image:width - 500
og:image:height - 500
og:description - The Summer Vibe | @ivoryoasis
--------------------------------------------------------------------------------
Follow @kisoarmicofficial
http://www.twitter.com/kisoarmic
http://instagram.com/kisoa
 
Und wie kann ich die Meta Daten auslesen?

So dass ich dann darin nach dem Link suchen kann?
 
Beispiel mit JSoup:

Code:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;


public class GetImageURL
{
	public static void main(String args[]) throws IOException
	{
		Document doc = Jsoup.connect("https://soundcloud.com/ivoryoasis/kiso-hvar-ft-msp").get();
		Elements imgs = doc.select("img"); // http://jsoup.org/cookbook/extracting-data/selector-syntax
		//Elements imgs = doc.select("img[itemprop=image]");
		//Elements imgs = doc.select("img[src~=i1.sndcdn.com]");
		//Elements imgs = doc.select("img[width=500]");
		//Elements imgs = doc.select("img[src$=.jpg]");
		
		System.out.println("--- HTML ---------------");
		for (Element e : imgs) System.out.println(e.outerHtml());
		
		System.out.println("--- SRC ----------------");
		for (Element e : imgs) System.out.println("SRC= " + e.attr("src"));
		
		System.out.println("------------------------");
		System.out.println("FIRST: " + imgs.first().attr("src"));
	}
}
Obiger Code extrahiert alle "img"-Tags (es sind nur 2) und zeigt sie an.

Wenn Du in obigen Code eine der auskommentierten Zeilen einkommentierst bekommst Du jeweils nur Deinen einen gewünschten Link zu Deinem Bild.
Im einfachsten Fall sieht das Programm z.B. so aus:
Code:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;


public class GetImageURL
{
	public static void main(String args[]) throws IOException
	{
		Document doc = Jsoup.connect("https://soundcloud.com/ivoryoasis/kiso-hvar-ft-msp").get();
		Elements imgs = doc.select("img[itemprop=image]"); // http://jsoup.org/cookbook/extracting-data/selector-syntax
		
		System.out.println("FIRST: " + imgs.first().attr("src"));
	}
}

Die Ausgabe ist:
Code:
FIRST: https://i1.sndcdn.com/artworks-000133471105-tiei06-t500x500.jpg

Damit das ganze funktioniert, musst Du die Datei "jsoup-1.8.3.jar" von http://jsoup.org/download runterladen und einbinden. Wie das Einbinden funktioniert hängt von Deiner Entwicklungsumgebung ab...


HTH

BigNum
 
Ok, vielen Dank!

Jetzt muss ich es noch so programmieren, dass das Programm auch Variabel ist und nicht nur dieser eine Link.

BEHOBEN!
Ergänzung ()

Wo liegt mein Fehler...?
Habe es bisher Konsolenbasiert.

Wollte das Programm so ablaufen lassen, dass es immer "hört" und das eingegeben zur ArrayList hinzufügt.
Wenn man dann den Befehl "-save" eingibt, sollen alle Links zu den Bildern ausgegeben werden. Doch irgendwie geht es nicht..

Console.readln() ist aus dem ConsolenPackage und liest die Eingabe auf der Konsole!

Bevor ich es modifiziert habe, lief es!
Link in die Zeile "Jsoup.connect(LINK).get()" und dann spuckte er mir den Link aus!

main:
Code:
package de.parser.jan;

import java.io.IOException;
import java.util.ArrayList;

import support.Console;

public class main {
	public static void main(String[] args) throws IOException {
		
		System.out.println("-Soundcloud IMG Saver-");
		System.out.println("Geben sie ihre Links ein!");
		System.out.println();
		
		ArrayList<String> linkList = new ArrayList<String>();
		String help = new String("-help");
		String save = new String("-save");
		String print = new String("-print");
		
		while(true){
			
			String input = new String(Console.readln());
			
			if(input.startsWith("-", 0)){
				if(input.equalsIgnoreCase(help))
					System.out.println("-save = Speichert alle Bilder der eingegebenen Links");
				
				if(input.equalsIgnoreCase(save))
					GetImageURL.getImg(linkList);
				
				if(input.equalsIgnoreCase(print))
					for(int i = 0; i < linkList.size(); i++){
						Console.println(linkList.get(i));
					}
			}else{
			linkList.add(Console.readln());
			}	
		}
	}
}

GetImageURL:
Code:
package de.parser.jan;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import support.Console;
 
import java.io.IOException;
import java.util.ArrayList;
 
 
public class GetImageURL
{
	public static void getImg(ArrayList<String> linkList) throws IOException
	{		
		for(int i = 0; i < linkList.size(); i++){
			Document doc = Jsoup.connect(linkList.get(i)).get();
			Elements imgs = doc.select("img[itemprop=image]"); http://jsoup.org/cookbook/extracting-data/selector-syntax
			
			System.out.println("FIRST: " + imgs.first().attr("src"));
			//return imgs.first().attr("src");
		}
	}
}
Ergänzung ()

Hab den Fehler, musste ganz unten in der add methode (Console.readln()); durch (input); ersetzen!
 
Zuletzt bearbeitet:
Ich denke es ist vernünftiger, die Methode "getImg(ArrayList<String> linkList)" in die Klasse "main" zu verschieben (und im Ergebnis nur eine Klasse, nämlich "main" zu haben), anstatt wie oben mit zwei Klassen zu arbeiten...


HTH

BigNum
 
Und wieso?
Weil ich in der Schule gelernt habe, "Objektorientiert" zu arbeiten...
 
(Statische) Klassen und Objektorientierung sind zwei paar Schuhe.
Objektorientierung wäre, wenn du z.B. eine Klasse Image erstellt, der du Konstruktor einen string übergeben kannst und die eine Methode getImg() hat.
Mann muss aber nicht alles durch die objektorientierte Brille sehen. Schönes Beispiel mit und ohne.
 
Wie kann ich den mit dem Scanner überprüfen, ob in der nächsten Zeile eine bestimmte Zeichenkette steht?

Mit "input.hasnextLine()" überprüfe ich ja nur, ob ich Inhalte in der nächsten Zeile habe...
Und wenn ich in die while-schleife "input.nextLine()" schreibe, dann springt er ja eine Zeile weiter...

Oder muss ich dann einfach mit input arbeiten, da dies die zeile ist, mit der er in der while-bedingung eins weitergesprungen ist?

Input == Konsolen eingabe!
 
FrazeColder schrieb:
Und wenn ich in die while-schleife "input.nextLine()" schreibe, dann springt er ja eine Zeile weiter...

Schau Dir die API doch mal genauer an. java.util.Scanner bietet noch weitere Methoden zum Prüfen...
 
ich bin mal so frei. liest so lange ein bis in einer zeile "end" steht, und gibt dann alle eingaben außer dem "end" aus.

Code:
try (Scanner scanner = new Scanner(System.in);) {
        String s;
	List<String> inputs = new ArrayList<>();
	while (!(s = scanner.nextLine()).equals("end")) {
		inputs.add(s);
	}
	inputs.forEach(System.out::println);
}
 
Zurück
Oben