Anzeige:
Ergebnis 1 bis 11 von 11

Thema: mySQL & Bash-Skript ...

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.02.2005
    Beiträge
    6

    mySQL & Bash-Skript ...

    Also ich hätte da mal ein Problem. Und zwar benutze ich mythTV zuhause. Das Programm bietet mir die Möglichkeit MP3-Playlisten anzulegen. Die Playlisten werden in mySQL verwaltet. Der Aufbau der Playlist-Tabelle ist folgendermaßen:
    1. Name der Playlist
    2. ID's der MP3 durch Komma getrennt ( z.Bsp. "1,17,333,1572")

    Soweit, so gut. Jetzt verwaltet das Programm seine MP3-Files auch in einer mySQL-Tabelle, und zwar mit folgedem Aufbau:
    1. ID
    2. Song
    3. Artist
    4. Album
    etc ....

    So, jetzt kommen ungefähr 2-3 neue Alben pro Woche dazu und ich würde mir gerne ein Skript schreiben, welches mir jede Nacht automatsich eine Playlist mit den 5 neusten Alben anlegt (und die alte natürlich vorher löscht). Wie ich einen mySQL Befehl per Bask-Skript starte das weiß ich schon.
    Meine Frage geht dahin wie der mySQL Befehl aussehen muss?
    Theoretisch müsste das Skript die MP3-Tabelle öffnen und ans Ende der Tabelle springen. Dann müsste es den MP3-Eintrag nehmen, sich das Album merken und zum nächsten Eintrag ( als wenn der letzte Eintrag ID5000 ist müsste es zu ID4999 gehen ) gehen. Ist dort der gleiche Albumname eingetragen dann wieder zum nächsten Eintrag, ist aber ein anderer Albumnamen vorhanden - diesen auch wieder merken. Das ganze müsste dann solange gehen bis 5 verschiedene Alben gefunden sind ( müssten ja auch die 5 neusten sein, da mysql ja neue Einträge hinten dran hängt, oder? ).
    Dann müsste das Skript einen neuen Durchlauf starten, und zwar nicht mehr durch die gesamte Tabelle, sondern nur noch durch die Songs die auf einem der 5 Alben sind. Bei diesem druchlauf müsste das Skript sich dann in einer Variable die ID's der MP3's merken und diese Variable später in die Playlist-Tabelle schreiben.
    So, ich hoffe man kann verstehen was ich will und brauche.
    Mein Problem ist, ich habe keine Ahnung wie die mySQL-Anweisungen aus zu sehen haben, wie ich das mit den Schleifen im Skript mache und ich wie ich die Daten ( die ein mysql-Befehl zurückgibt ) in Variablen/Arrays speichern kann?

    Bitte, bitte, helft mir ....



    PS: Wenn jetzt jemand fragt wozu das gut sein soll, ich habe über 1000 Alben und es ist echt mühselig sich immer Playlisten "per Hand" zu machen, vorallem weil ich manchmal gar nicht weiß was neu ist. Und es wäre echt schön wenn ich mittags meine Box einschalte, gehe auf Musik hören und habe dann immer eine Playlist mit den 5 neusten Alben.

  2. #2
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    versuchs mal mit:
    Code:
    select * from
    MP3TABELLE
    order by id desc
    limit 5
    wenn dass deine gesuchten sind, dann hast glück gehabt... ansonsten kann ich dir nur empfehlen dich ein wenig mehr mit relationalen datenbanken und sql beschäftigen...

    greetz

    ps: ich glaube es reicht vollkomen aus in nur einem forum zu posten... du musst nicht extra auch noch auf lf.de den gleichen thread aufmachen...
    Geändert von quinte17 (10-02-2005 um 13:47 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    10.02.2005
    Beiträge
    6

    schön und gut ...

    ... aber mit der mySQL abfrage bekomme ich nur die letzten 5 Lieder und nicht die Lieder der letzten 5 Alben.

    denke ich brauche 2. abfragen. die erste abfrage gibt mir die namen der 5 letzten alben (von hinten) ... die 2. abfrage gibt mir nun alle songs aus die auf den 5 alben sind.
    hmmm, nur wie sieht der mysql befehl aus? und wie klappt das per bash?

  4. #4
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von der_Angler
    Playlisten werden in mySQL verwaltet. Der Aufbau der Playlist-Tabelle ist folgendermaßen:
    1. Name der Playlist
    2. ID's der MP3 durch Komma getrennt ( z.Bsp. "1,17,333,1572")
    jemand sollte den entwickler für das design erschlagen, am besten mit einem buch über normalformen.


    -j

  5. #5
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    yepp genau des habe ich mir auch gedacht ^^

  6. #6
    Registrierter Benutzer
    Registriert seit
    10.02.2005
    Beiträge
    6

    na schön ...

    ... schön das ihr so denkt, aber darum geht es ja gar nicht.
    1. Ist mythTV nunmal so aufgebaut und es ist ein echt weltklasse Produkt.
    2. auch wenn die Playlist-Tabelle so aufgebaut ist, so hat das ja erstmal wenig mit meinem Problem zu tun. Ich meine auch wenn die Plalist-Tabelle anders aufgebaut wäre, dann bräuchte ich immer noch meine mySQL Abfrage nach den 5 letzten Alben und im 2. Schritt alle Songs der Alben.
    Also weiß jemand wie so ne Abfrage aussehen müsste und wie ich die in ein Bash Skript verpacke

  7. #7
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    Code:
    select album
    from MP3TABELLE
    group by album
    order by id desc
    limit 5
    vielleicht hilft ja das
    greetz

  8. #8
    Registrierter Benutzer
    Registriert seit
    10.02.2005
    Beiträge
    6

    klingt schonmal ganz gut ...

    ... ich werde das später mal zuhause versuchen.
    Nur habe ich jetzt noch eine Frage, wie und wo speicher ich das Ergebnis dieser Abfrage in einem Bash-Skript???

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Ich weiß nicht genau, wie du MySQL aus der Bash aus aufrufst, unter Google habe ich leider nichts gefunden, wäre gut, wenn du das Programm nennen könntest.

    Allgemein wird in der Bash mit Variablen gearbeitet, um Werte abzuspeichern:
    Code:
    # Speichert die Ausgabe (in diesem Fall "Ausgabe") in der Variablen OUT:
    OUT=`echo Ausgabe`
    
    # Speichert die Zahl 47 in der Variable Zahl
    ZAHL=47
    
    # Gibt den Wert der Variable Zahl aus (also "47")
    echo $ZAHL
    
    # Gibt "Neu: Ausgabe47" aus
    NEU="$OUT$ZAHL"
    echo "Neu: $NEU"
    
    ...
    Also, am besten mal das Programm sagen, mit dem du die Befehle ausführst (am besten mit Homepage ), dann kann ich dir weiterhelfen...

  10. #10
    Registrierter Benutzer
    Registriert seit
    10.02.2005
    Beiträge
    6

    okay, erstmal vielen Dank ...

    ... also der Befehl ist schon mal der richtige. Soweit bin ich jetzt
    Code:
    #!/bin/bash
    
    variable=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 5"`
    
    echo $variable
    nur leider stehen dann alle 5 Alben hintereinander
    Code:
    [root@mythtv mythtv]# ./alben_liste.sh
    album Verschwende deine Zeit Turning Point The Mind Of Mannie Fresh Get Lifted Concrete Rose
    [root@mythtv mythtv]#
    Eigentlich sind das 5. Alben :
    1. Eintrag = "album" wegwerfen
    2. Eintrag = "Verschwende deine Zeit"
    3. Eintrag = "Turning Point"
    4. Eintrag = "The Mind Of Mannie Fresh"
    5. Eintrag = "Get Lifted"
    6. Eintrag = "Concrete Rose"

    hmmm, also irgendwie kann ich die so nicht aus der datei bekommen. ich kann zwar mit
    Code:
    #!/bin/bash
    
    variable=(`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 5"`)
    
    for var in ${variable[*]}
    do
            echo $var
    done
    folgendes Ergebniss bekommen
    Code:
    [root@mythtv mythtv]# ./alben_liste.sh
    album
    Verschwende
    deine
    Zeit
    Turning
    Point
    The
    Mind
    Of
    Mannie
    Fresh
    Get
    Lifted
    Concrete
    Rose
    [root@mythtv mythtv]#
    Aber das bringt mich irgendwie nicht weiter??? Gibt es ne Möglichkeit dem mySQL zu sagen er soll nur das 5. letzte Ergebnis ausgeben? Und dann ein zweiter Befehl in dem nur das 4. letzte Album ausgegeben wird?
    Oder wie sonst kann ich dafür sorgen das ich jeweils den kompletten albumnamen in einer variabel habe?



    PS: Vielen Dank schonmla bis hier

  11. #11
    Registrierter Benutzer
    Registriert seit
    10.02.2005
    Beiträge
    6

    Smile die Lösung!

    So, jetzt habe ich endlich ne Lösung gefunden, ist zwar nicht die feinste Art und Weise - aber es geht!
    Code:
    #!/bin/bash
    
    ####
    #
    # die letzten 5 Alben
    #
    album1=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 4,1"`
    album2=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 3,1"`
    album3=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 2,1"`
    album4=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 1,1"`
    album5=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT album FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 0,1"`
    
    ####
    #
    # die letzten 5 Artist
    #
    artist1=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT artist FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 4,1"`
    artist2=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT artist FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 3,1"`
    artist3=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT artist FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 2,1"`
    artist4=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT artist FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 1,1"`
    artist5=`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT artist FROM musicmetadata GROUP BY album ORDER BY intid DESC LIMIT 0,1"`
    
    
    ###
    #
    # In Array speichern
    #
    album[4]=${album1:6}
    artist[4]=${artist1:7}
    
    album[3]=${album2:6}
    artist[3]=${artist2:7}
    
    album[2]=${album3:6}
    artist[2]=${artist3:7}
    
    album[1]=${album4:6}
    artist[1]=${artist4:7}
    
    album[0]=${album5:6}
    artist[0]=${artist5:7}
    
    ###
    #
    # Songs speichern
    #
    
    songs1=(`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT intid FROM musicmetadata WHERE album='${album[0]}' AND artist='${artist[0]}' ORDER BY intid
    DESC"`)
    songs2=(`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT intid FROM musicmetadata WHERE album='${album[1]}' AND artist='${artist[1]}' ORDER BY intid
    DESC"`)
    songs3=(`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT intid FROM musicmetadata WHERE album='${album[2]}' AND artist='${artist[2]}' ORDER BY intid
    DESC"`)
    songs4=(`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT intid FROM musicmetadata WHERE album='${album[3]}' AND artist='${artist[3]}' ORDER BY intid
    DESC"`)
    songs5=(`mysql -umythtv -pmythtv -Dmythconverg -e "SELECT intid FROM musicmetadata WHERE album='${album[4]}' AND artist='${artist[4]}' ORDER BY intid
    DESC"`)
    
    dummy_var="x"
    for var in ${songs1[*]}
    do
            if [ $dummy_var = "y" ]
            then
                    songliste=`echo $songliste, $var`
            fi
            dummy_var="y"
    done
    dummy_var="x"
    for var in ${songs2[*]}
    do
            if [ $dummy_var = "y" ]
            then
                    songliste=`echo $songliste, $var`
            fi
            dummy_var="y"
    done
    dummy_var="x"
    for var in ${songs3[*]}
    do
            if [ $dummy_var = "y" ]
            then
                    songliste=`echo $songliste, $var`
            fi
            dummy_var="y"
    done
    dummy_var="x"
    for var in ${songs4[*]}
    do
            if [ $dummy_var = "y" ]
            then
                    songliste=`echo $songliste, $var`
            fi
            dummy_var="y"
    done
    dummy_var="x"
    for var in ${songs5[*]}
    do
            if [ $dummy_var = "y" ]
            then
                    songliste=`echo $songliste, $var`
            fi
            dummy_var="y"
    done
    
    
    songliste=${songliste:2}
    
    
    echo `mysql -umythtv -pmythtv -Dmythconverg -e "UPDATE musicplaylist SET songlist = '' WHERE playlistid = 3"`
    echo `mysql -umythtv -pmythtv -Dmythconverg -e "UPDATE musicplaylist SET songlist = '$songliste' WHERE playlistid = 3"`
    Aber wenn jemand ne bessere Lösung weiß oder überhaupt etwas zu verbessern wüßte, dann soll er es sagen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •