iTunesで再生チャートランキングを定期的に自動で作りたい(3)

ひとまず、作ってみた。

MySQLでデータ管理をして、プログラムを実行すると、前回からの再生回数が差分として登録される。

DBはざっとこんな構成でテーブルは2つのみ。

mysql> desc tbm_track;

+———————-+————–+——+—–+———+——-+

| Field | Type | Null | Key | Default | Extra |

+———————-+————–+——+—–+———+——-+

| Track_id | int(11) | NO | PRI | NULL | |

| Name | varchar(160) | YES | | NULL | |

| Artist | varchar(80) | YES | | NULL | |

| Album_Artist | varchar(45) | YES | | NULL | |

| Album | varchar(200) | YES | | NULL | |

| Genre | varchar(45) | YES | | NULL | |

| Kind | varchar(45) | YES | | NULL | |

| Size | int(11) | YES | | NULL | |

| Total_Time | int(11) | YES | | NULL | |

| Disc_Number | int(11) | YES | | NULL | |

| Disc_Count | int(11) | YES | | NULL | |

| Year | int(11) | YES | | NULL | |

| Date_Modified | datetime | YES | | NULL | |

| Date_Added | datetime | YES | | NULL | |

| Bit_Rate | int(11) | YES | | NULL | |

| Sample_Rate | int(11) | YES | | NULL | |

| Play_Count | int(11) | YES | | NULL | |

| play_date | datetime | YES | | NULL | |

| Play_Date_UTC | datetime | YES | | NULL | |

| Sort_Atrist | varchar(45) | YES | | NULL | |

| Compilation | varchar(45) | YES | | NULL | |

| Persistent_ID | varchar(45) | YES | | NULL | |

| Track_Type | varchar(45) | YES | | NULL | |

| Location | varchar(500) | YES | | NULL | |

| File_Folder_Count | int(11) | YES | | NULL | |

| Lobrary_Folder_Count | int(11) | YES | | NULL | |

+———————-+————–+——+—–+———+——-+

26 rows in set (0.02 sec)

mysql> desc tbl_update

-> ;

+————————+————-+——+—–+———+——-+

| Field | Type | Null | Key | Default | Extra |

+————————+————-+——+—–+———+——-+

| Track_ID | int(11) | NO | PRI | NULL | |

| Update_data | datetime | NO | PRI | NULL | |

| Type | varchar(45) | YES | | NULL | |

| Play_Count | int(11) | YES | | NULL | |

| Incremental_Play_Count | int(11) | YES | | NULL | |

+————————+————-+——+—–+———+——-+

5 rows in set, 1 warning (0.02 sec)

mysql>

Javaのソースはひとまず動かしたレベル。XMLの読取はhttp://d.hatena.ne.jp/terazzo/20080524/1211656594を参考にして、そこのソースは割愛。

import java.io.IOException;

import java.net.URL;

import java.util.Date;

import java.util.List;

import java.util.Map;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.EntityTransaction;

import javax.persistence.Persistence;

import javax.persistence.Query;

import org.xml.sax.SAXException;

import sample.plist.PropertyListUtils;

public class ItunesList {

/**

* @param args

*/

public static void main(String[] args) {

// TODO 自動生成されたメソッド・スタブ

ItunesList t = new ItunesList();

try{

t.printTracks();

}catch (Exception e){

e.printStackTrace();

}

}

private static final String TEST_FILE_PATH = “file:C:\\Users\\jun\\Music\\iTunes\\iTunes Music Library.xml“;

public void printTracks() throws IOException, SAXException {

// xmlファイルの読み込み

//URL url = getClass().getResource(TEST_FILE_PATH);

URL url = new URL(TEST_FILE_PATH);

Object content = PropertyListUtils.load(url);

Map tracks = (Map)*1 {

try{

Integer track_id_xml = (Integer)xml_track.get(“Track ID”);

//すでにDBに登録済みかチェック

boolean already_rip_check=false;

for(TbmTrack tbm_track_db : db_mater_list){

if(tbm_track_db.getTrack_id() == track_id_xml.intValue()){

//再生回数を更新

already_rip_check = true;

if*2.intValue() ){

TblUpdate update = this.setTblUpdate(tbm_track_db,(Integer)xml_track.get(“Play Count”));

em.persist(update);

tbm_track_db.setPlay_Count*3;

}

break;

}

}

if(!already_rip_check){

//該当レコードが無いので新規追加

TbmTrack track = setTbmTrack(xml_track);

em.persist(track);

}

}catch (Exception e){

e.printStackTrace();

}

}

tx.commit();

em.close();

emf.close();

}

private TblUpdate setTblUpdate(TbmTrack tbmtrack,Integer fromXml){

TblUpdate update = new TblUpdate();

update.setTrack_ID(tbmtrack.getTrack_id());

update.setUpdate_data(new Date());

update.setPlay_Count(tbmtrack.getPlay_Count());

update.setIncremental_Play_Count(fromXml.intValue() – tbmtrack.getPlay_Count());

return update;

}

private TbmTrack setTbmTrack(Map xml_track) {

TbmTrack track = new TbmTrack();

track.setTrack_id*4;

track.setAlbum*5;

track.setAlbum_Artist*6;

track.setArtist*7;

if(xml_track.get(“Bit Rate”) != null){

track.setBit_Rate*8;

}

track.setCompilation*9;

track.setDate_Added*10;

track.setName*11;

track.setGenre*12;

track.setKind*13;

track.setSize*14;

if(xml_track.get(“Disc Number”) != null){

track.setDisc_Number*15;

}

if(xml_track.get(“Disc Count”) != null){

track.setDisc_Count*16;

}

if(xml_track.get(“Year”) != null){

track.setYear*17;

}

if(xml_track.get(“Date Modified”) != null){

track.setDate_Modified*18;

}

if(xml_track.get(“Sample Rate”) != null){

track.setSample_Rate*19;

}

if(xml_track.get(“Play Count”) != null){

track.setPlay_Count*20;

}

if(xml_track.get(“Play Date”) != null){

track.setPlay_Date(new Date(((Integer) xml_track.get(“Play Date”)).longValue()));

}

track.setPlay_Date_UTC*21;

track.setCompilation*22;

track.setPersistent_ID*23;

track.setTrack_Type*24;

return track;

}

public static List getAllRecordsTbmTrack(EntityManager em){

Query q = em.createQuery(“select t from TbmTrack t”);

List list = q.getResultList();

return list;

}

}

*1:Map) content).get(“Tracks”);

int i=1;

EntityManagerFactory emf = Persistence.createEntityManagerFactory(“JPA_test”);

EntityManager em = emf.createEntityManager();

// DBの最新情報を取得

List db_mater_list = getAllRecordsTbmTrack(em);

EntityTransaction tx = em.getTransaction();

tx.begin();

for (Map xml_track : tracks.values(

*2:xml_track.get(“Play Count”) != null) &&

tbm_track_db.getPlay_Count() != ((Integer)xml_track.get(“Play Count”

*3:Integer)xml_track.get(“Play Count”

*4:Integer)xml_track.get(“Track ID”

*5:String)xml_track.get(“Album”

*6:String)xml_track.get(“Album Artist”

*7:String)xml_track.get(“Artist”

*8:Integer)xml_track.get(“Bit Rate”

*9:String)xml_track.get(“Compilation”

*10:Date)xml_track.get(“Date Added”

*11:String)xml_track.get(“Name”

*12:String)xml_track.get(“Genre”

*13:String)xml_track.get(“Kind”

*14:Integer)xml_track.get(“Size”

*15:Integer)xml_track.get(“Disc Number”

*16:Integer)xml_track.get(“Disc Count”

*17:Integer)xml_track.get(“Year”

*18:Date)xml_track.get(“Date Modified”

*19:Integer)xml_track.get(“Sample Rate”

*20:Integer)xml_track.get(“Play Count”

*21:Date)xml_track.get(“Play Date UTC

*22:String)xml_track.get(“Compilation”

*23:String)xml_track.get(“Persistent ID”

*24:String)xml_track.get(“Track Type”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です