Archief - Q: playlist in mysql database

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Sprits

Legacy Member
is er iemand die een code of programma heeft dat ervoor kan zorgen dat mijn (winamp) playlist in een mysql database terecht komt?

ge kunt de winamp playlist late omzette na html ma ik zou graag de titels, artiest en/of tijd in een database kunne zette... da maakt het makkelijker om mee te werke :)

NeoNeke

Legacy Member
easy way around zou zijn die lijst naar excel laten exporten (kan denk ik best volgens wat ik nog weet van winamp) die kan je gewoon dumpen in je mysql. (je kan natuurlijk de data copy pasten in excel)

killgore

Legacy Member
Slaat uw playlists op als m3u, pls of zo, das extreem simpel in te lezen, kunde zelfs met php doen zonder veel problemen.

edit: ik denk zelfs dat winamp zen playlists in xml kunnen opgeslagen worden

Sprits

Legacy Member
winamp kan na html omzette ma ni na xml!

ma ik heb iTunes gedownload en van die library een xml file late genere. en dan op internet gezocht na een xml parser en zelf iet geschreve vo het in de database te zette!
het werkt perfect, alleen da 3000+ liekes tegelijk importeren ni goe werkt :p

dus ik heb alles in categoriën gezet!
anyways, merci vo de replies :)

Tyfius

Legacy Member
Er bestaan een aantal plugins die tijdens het spelen de info kunnen doorsturen naar een mysql database. Ik heb dat vroeger eens gehad.
De naam ontglipt me evenwel op dit moment.

Sprits

Legacy Member
Tyfius zei:
Er bestaan een aantal plugins die tijdens het spelen de info kunnen doorsturen naar een mysql database. Ik heb dat vroeger eens gehad.
De naam ontglipt me evenwel op dit moment.

Daarvoor heb ik TrackUp gebruikt van winamp... werkte wel goe, ma zate nog wa bugs in... zoals de pc die ni wil afsluite als TrackUp nog draait! :p

mja, ik moest in 1 keer alles in de database hebbe.

Sprits

Legacy Member
nu heb ik dus nog een klein probleemke!
ik heb een php pagina gemaakt die ervoor zorgt da elke playlist in de juiste database wordt gezet!
vb: eerst de volledige drum&bass playlist, als je dan op doorgaan klikt, doet hij de japanse playlist, als je dan op doorgaan klikt, doet hij .... enzovoort.

als ik naar import.php?music=trance ga, dan doet hij dit dus:
eerst de bestaande database delete, een nieuwe aanmake en dan alles erin steken.
dees werkt goe (hoe crappy de code er dan ook mag uitzien :p)
PHP:
if ($music == trance)
{	
	$trance = iTunesXmlParser("trance_playlist.xml");
	// database clearen en terug een nieuwe aanmaken
	$query = "DROP TABLE IF EXISTS trance";
	mysql_query($query, $mysql) or die(mysql_error());
	$query = "CREATE TABLE `trance` (
	`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
	`name` VARCHAR( 255 ) NOT NULL ,
	`artist` VARCHAR( 255 ) NOT NULL ,
	`album` VARCHAR( 255 ) NOT NULL ,
	PRIMARY KEY ( `id` )
	);";
	mysql_query($query, $mysql) or die(mysql_error());
	
	$aantal = 0;
	// elk liedje apart in de database steken
	foreach ($trance as $trances)
	{
		$query = "INSERT INTO trance (name, artist, album) VALUES (\"".$trances["Name"]."\", \"".$trances["Artist"]."\", \"".$trances["Album"]."\");";
		mysql_query($query, $mysql) or die(mysql_error());
		$aantal = $aantal + 1;
	}
	echo($aantal . " nummers toegevoegd in de database.<br><a href=\"import.php?music=unsorted\">Doorgaan</a><br><a href=\"import.php\">Terug</a>");
}

nu, bij mijn trance playlist heb ik ong 1800 titels en dees zijn er teveel om ineens in de database te krijge. Ik wil er nu voor zorgen da de eerste 500 titels worde gedaan en dan de volgende 500 totda de playlist gedaan is... heeft iemand een idee hoe je zoiets doet?
een website, een stukje code of iets anders... zolang het mij ma kan helpe :)

Tyfius

Legacy Member
Lijkt me eenvoudig, tellen hoeveel items er in totaal zijn, if $aantal > 500 een for lus inschakelen, als i = 500 $aantal = $aantal - 500 if $aantal > 500 ... enzovoort tot $aantal < 500 then for i tot $aantal.

Sprits

Legacy Member
ja, ma het probleem is hoe ik ervoor kan zorge da hem de volgende 500 doe en die andere laat staan...

ben ni zo goe in logisch denke :p

Zero Grav

Legacy Member
Bestaande waardes ophalen, in een array proppen, dan de waardes invoegen en zeggen if(in_array()) niet invoegen, else, wel.

Om uw database te sparen kunt ge ook enkel bij een update een html bestand laten maken dat uw php uitleest met al uw muziek in voor die controle op bestaande tracks, killgore zal me wel verbeteren als ik fout zit maar ik denk dat dat beter is omdat dat uw database dan minder zal belasten.

Sprits

Legacy Member
Zero Grav zei:
Bestaande waardes ophalen, in een array proppen, dan de waardes invoegen en zeggen if(in_array()) niet invoegen, else, wel.

Om uw database te sparen kunt ge ook enkel bij een update een html bestand laten maken dat uw php uitleest met al uw muziek in voor die controle op bestaande tracks, killgore zal me wel verbeteren als ik fout zit maar ik denk dat dat beter is omdat dat uw database dan minder zal belasten.
dan zou ik eigelijk de functie "iTunesXmlParser" moeten aanpasse vo goe te zijn!

dit heb ik ni zelf geschreve omda ik me mijn php nog ni ver zit :)
PHP:
<?php function iTunesXmlParser($filename, $sort_field=NULL, $sort_direction="up")
{
	// save the input in global variables for the sort function
	global $g_ITX_field, $g_ITX_direction;
	$g_ITX_field = $sort_field;
	$g_ITX_direction = $sort_direction;
	
	// init main variables
	$songs = array();
	$xml = NULL; // parsed XML
	
	// read the file into $xml first
	ob_start();
		readfile($filename);
		$xml = ob_get_contents();
	ob_end_clean();
	
	// open the xml document in the DOM
	if (!$xml || !$dom = domxml_open_mem($xml))
		die("Could not parse iTunes XML file: ".$filename);
	
	// get the root element
	$root = $dom->document_element();
	
	// yeah "dict" means everything, playlist, and song that makes sense... NOT
	// find the first "dict"
	$children = $root->child_nodes();
	foreach ($children as $child)
	{
		if ($child->node_name()=="dict")
		{
			$root = $child;
			break;
		}
	}

	// do that again, and find the second inner dict
	$children = $root->child_nodes();
	foreach ($children as $child)
	{
		if ($child->node_name()=="dict")
		{
			$root = $child;
			break;
		}
	}
		
	// now go through all the child elements
	$children = $root->child_nodes();
	foreach ($children as $child)
	{
		// all the sub dicts from here on should be songs
		if ($child->node_name()=="dict")
		{
			$song = NULL;
			
			// get all the elements
			$elements = $child->child_nodes();
			for ($i = 0; $i<count($elements); $i++)
			{
				// alright whomever wrote this xml file was smoking something serious
				// in normal XML documents we would do:
				//  <artist>Daft Punk</artist>
				// but in Apple iTunes bong land we do:
				//  <key>Artist</key><string>Daft Punk</string>
				
				if ($elements[$i]->node_name()=="key")
				{
					// so I'm just going to expect that i++ (<string>, <int>, etc...) is always going to be there,
					//  if the key's name is <key>
					//  instead of doing some error checking here to make sure there are matching values to keys
					$key = $elements[$i]->get_content();
					$i++;
					$value = $elements[$i]->get_content();
					$song[$key]=$value;
				}
			}
			
			// save the song
			if ($song)
				$songs[] = $song;
		}
	}
	
	// now sort the songs
	// $sort_field=NULL, $sort_direction="up"
	if ($sort_field)
	{
		uasort($songs, "iTunesXmlSongSort");
	}

	return $songs;
}

$g_ITX_field = NULL;
$g_ITX_direction = NULL;
// to be used with the uasort() array function in PHP
function iTunesXmlSongSort($left, $right)
{
	global $g_ITX_field, $g_ITX_direction;
	
	// return the strcmp() of the two fields
	if (isset($left[$g_ITX_field])&&isset($right[$g_ITX_field]))
	{
		if (strcasecmp($g_ITX_direction, "up"))
			return strcasecmp($left[$g_ITX_field],$right[$g_ITX_field]);
		else
			return strcasecmp($right[$g_ITX_field],$left[$g_ITX_field]);	
	}
	elseif (isset($left[$g_ITX_field]))
		return -1;
	else
		return 1;
}

?>

over de database sparen... een database kan toch wel een dikke 3500 titels, artist en albums bijhoude zonder er echt last van te hebbe he :)

Tyfius

Legacy Member
Over die database moet ge u het minst druk maken. Ik heb scriptjes geschreven die items per 100.000 worden toegevoegd.
PHP:
$aantal = count($trance);
$limit = 500;

while ($aantal > $limit)
{
    for ($i = $aantal; $i <= $aantal - $limit; $i--)
    {
        $query = "INSERT INTO ... $trance[$i]";
    }
    $aantal = $aantal - $limit;
}

for ($i = $aantal; $i <= $aantal; $i--)
{
    $query = "INSERT INTO ... $trance[$i]";
}
Ik dacht aan zoiets, 't is raprap geschreven maar dit is het idee. Kan natuurlijk performanter maar ik heb niveel zin om op dit uur al veel na te denken :p

Sprits

Legacy Member
Tyfius zei:
Over die database moet ge u het minst druk maken. Ik heb scriptjes geschreven die items per 100.000 worden toegevoegd.
PHP:
$aantal = count($trance);
$limit = 500;

while ($aantal > $limit)
{
    for ($i = $aantal; $i <= $aantal - $limit; $i--)
    {
        $query = "INSERT INTO ... $trance[$i]";
    }
    $aantal = $aantal - $limit;
}

for ($i = $aantal; $i <= $aantal; $i--)
{
    $query = "INSERT INTO ... $trance[$i]";
}
Ik dacht aan zoiets, 't is raprap geschreven maar dit is het idee. Kan natuurlijk performanter maar ik heb niveel zin om op dit uur al veel na te denken :p

vriendelijk bedankt! da helpt toch al :)

nu heb ik juist nog een probleem ontdekt!
in sommige titels van mijn liekes sta een "
natuurlijk ziet php da als het einde van de query en dan krijg ik een fout :p
zoiets kunt ge wrs oplosse met preg_replace ofzo ma waar moet ik da dan zette? in de parser zelf of mijn stukje code?

bedankt op voorhand

Sprits

Legacy Member
nibbler.be zei:
nu heb ik juist nog een probleem ontdekt!
in sommige titels van mijn liekes sta een "
natuurlijk ziet php da als het einde van de query en dan krijg ik een fout :p
zoiets kunt ge wrs oplosse met preg_replace ofzo ma waar moet ik da dan zette? in de parser zelf of mijn stukje code?

bedankt op voorhand

dees is dus al opgelost... :)

ma ik heb het nog altij ni door hoe ge ervoor kunt zorge da het elke 500 liekes stopt om het in de database te zette en dan de volgende 500 pakt!
als ik nu probeer dan krijg ik dezen error
Code:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 12 bytes) in /home/httpd/vhosts/nibbler.be/httpdocs/*****/itunes_xml_parser.php on line 144

en op lijn 144 staat er dees
PHP:
// get all the elements
			$elements = $child->child_nodes();

Tyfius

Legacy Member
Awel, die per 500 doe ik in mijn code voorbeeld een paar posts hoger.

Sprits

Legacy Member
Tyfius zei:
Awel, die per 500 doe ik in mijn code voorbeeld een paar posts hoger.

ik weet het! ma ik snap de code ni :p
ma ik zal is ffkes gewoon probere... mss da het werkt :)

*edit*
PHP:
$aantal = count($trance);
	$limit = 500;

	while ($aantal > $limit)
	{
    	for ($i = $aantal; $i <= $aantal - $limit; $i--)
    	{
        	$query = "INSERT INTO trance (name, artist, album) VALUES (\"".$trance[$i]["Name"]."\", \"".$trance[$i]["Artist"]."\", \"".$trance[$i]["Album"]."\");";
    	}
    	$aantal = $aantal - $limit;
	}

	for ($i = $aantal; $i <= $aantal; $i--)
	{
    	$query = "INSERT INTO trance (name, artist, album) VALUES (\"".$trance[$i]["Name"]."\", \"".$trance[$i]["Artist"]."\", \"".$trance[$i]["Album"]."\");";
	}

dees is dus wa ik ervan gemaakt heb... ma ik krijg nog altij dezelfde error!

ik denk eerder da de fout zit in de parser die zoveel lijne tegelijk ni kan leze...

Tyfius

Legacy Member
Als ge dat stukje nog niet snapt dan zou ik sterk overwegen om eens een PHP tutorial door te nemen...

Sprits

Legacy Member
Tyfius zei:
Als ge dat stukje nog niet snapt dan zou ik sterk overwegen om eens een PHP tutorial door te nemen...

daar ben ik dus mee bezig :p

mja, ik snap wel wa de code betekent... ma als ik ze volg dan snap ik nog altij ni hoe zoiets bij 500 stopt om dan de volgende 500 te doen...

hetgeen ik al gezien heb van dingen die zich installeren (zoals een forum ofzo) op uwe webserver, dat die altij als er teveel zijn van bepaalde dingen, die gebruik maakt van een soort van stappen systeem!
import.php?music=trance&step=1
dus hij telt hoeveel er zijn, en bepaald dan het aantal stappen!
dus bij de eerste 500 is het step=1
de volgende step=2
enzovoort!
ma, ik zal wel wa verder zoeke opt internet of er geen makkelijker systeem is want ik begin het hier moeilijk te make :p
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan